tenev911
Messages postés23Date d'inscriptionjeudi 21 juillet 2005StatutMembreDernière intervention19 avril 2009
-
13 août 2008 à 23:44
cs_Chatbour
Messages postés764Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention 6 septembre 2010
-
14 août 2008 à 16:00
Bonjour,
J'ai un problème plutot génant, j'ai posté ce sujet sur developpez.com sans grand résultat, j'aurai surement plus de chance ici :)
J'ai actuellement un String (Qui est le contenu d'un fichier CSS) et j'aimerai remplacer les couleurs qui sont à l'intérieur.
Je m'explique, j'ai une fonction (methode statique) "conversion(String str)" qui prend une couleur sous la forme "#FF0000" et la transforme pour donner une autre couleur (Par exemple "#008E45").
J'aimerai que toutes les occurrences dans mon fichier CSS ayant comme schéma "#XXXXXX" se transforme en conversion("#XXXXXX");
Bon, mon expression regex n'est pas parfaite (Elle cherche tout ce qui contient # et possède 6 caractères après), ça je pourrai l'arranger.
Le problème, c'est que conversion("$0") où $0 devrait représenter mon #XXXXXX, envoie juste "$0" à ma methode conversion(), donc forcément, j'ai une erreur.
Je voulais juste savoir comment passer de "#XXXXXX" à conversion("#XXXXXX");
Sachant que XXXXXX peut etre n'importe quoi.
Il y a peut être une solution avec les Pattern et les Matcher, mais je ne l'ai pas très bien compris.
Merci beaucoup pour votre aide ;)
PS : Mon fichier doit faire dans les 1000-2000 lignes, devrait-je tout mettre dans un buffer ?
cs_Chatbour
Messages postés764Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention 6 septembre 201019 14 août 2008 à 01:29
Salut,
ça ne doit pas fonctionner bien sûr : $0 n'est ici qu'une String et n'a pas le même sens qu'en script shell..
Voici un essai que j'ai fais à la volée peut être que c'est que tu cherches :
import java.util.Vector;
class Tester {
// Un exemple de ta méthode conversion
public static String conversion(String str) {
return str.replace("5", "0");
}
// Méthode qui retourne les positions des couleurs dans une chaine
public static int[] getColorsPositions(String str) {
Vector vect = new Vector();
for (int i=0; i<str.length(); i++) {
if (str.charAt(i) == '#') {
vect.addElement(i);
}
}
int tab[] = new int[vect.size()];
for (int i=0; i<vect.size(); i++) {
tab[i] = vect.get(i);
}
vect = null;
return tab;
}
public static void main(String[] args) {
// Un exemple pour le test String str "les couleurs rouge #123456 et noir =#987654.";
// On traite str couleur par couleur
for (int index : getColorsPositions(str)) {
String sub_str = str.substring(index, index + 7);
if (sub_str.matches("#{1}.{6}")) {
str = str.replaceAll(sub_str, conversion(sub_str));
}
}
// Affichage après les modifications
System.out.println(str);
}
}
pourvu que cela t'aide <
_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..
http://books.go%3C/body
cs_Chatbour
Messages postés764Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention 6 septembre 201019 14 août 2008 à 13:01
Re,
voilà comment je procède : je récupère d'abord les positions de tous les caractères '#' dans un tableau tab (méthode getColorsPositions()), par la suite, je peux récupérer facilement les codes couleurs en parcourant tab (chaque code couleur est subsbtring(tab[i], tab[i] + 7))..
j'espère avoir été assez clair.. n'hésites pas à reposter s'il y a des questions..
_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..
http://books.go%3C/body
tenev911
Messages postés23Date d'inscriptionjeudi 21 juillet 2005StatutMembreDernière intervention19 avril 2009 14 août 2008 à 15:33
Rebonjour !
Excusez moi de vous déranger mais j'ai remarqué que si j'ai deux #FF0000, le programme va transformer les deux #FF0000 en #123456 (J'ai mis un nombre au pif pour l'exemple) et qu'ensuite le deuxième #FF0000 qui a été transformé en #123456 se retransforme a son tour en #098765 !
Pour éviter cela, plutôt que de faire :
Comme ça, dès que le premier #FF0000 est transformé en #123456, le deuxième #FF0000 devient instantanément le premier, et sera concerné par replaceFirst !
Liverion
Messages postés296Date d'inscriptionmardi 22 avril 2008StatutMembreDernière intervention18 août 2008 14 août 2008 à 10:05
Sinon avec ta fonction, je sais pas si ca pourrait fonctionner, mais quelque chose comme :
str = str.replaceAll("#{1}.{6}", "conversion("" + $0 + "")" );
Le "je sais pas si ca pourrait fonctionner" fait reference au "$0", je sais pas trop si tu recupere bien le premier argument de la fonction courant avec ^^
~~
Les trois lois de Codes-Sources :
Loi 1) Tu lis et respectes le reglement
Loi 2) Tu penses à valider si une reponse apportée à ton problème t'a aidé
Loi 3) Si tu ne respectes pas les 2 premières ....TU SORS !!
tenev911
Messages postés23Date d'inscriptionjeudi 21 juillet 2005StatutMembreDernière intervention19 avril 2009 14 août 2008 à 14:00
Oui, j'avais compris comment ça marchais mais je me demandais comment faire ce que tu as fait (Je me voyais déjà utiliser une classe Scanner pour parcourir toutes les lignes une a une et remplacer les lignes ayant un #xxxxxx, etc...)
Grâce a toi, j'ai un code très correct et simple, encore merci :)
cs_Chatbour
Messages postés764Date d'inscriptionjeudi 27 juillet 2006StatutMembreDernière intervention 6 septembre 201019 14 août 2008 à 16:00
merci pour le retour
_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..
http://books.go%3C/body