Remplacement d'un mot par le renvoi d'une fonction dans un string [Résolu]

Messages postés
23
Date d'inscription
jeudi 21 juillet 2005
Statut
Membre
Dernière intervention
19 avril 2009
- - Dernière réponse : cs_Chatbour
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Derniè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");

Pour cela j'ai essayé ceci :

str = str.replaceAll("#{1}.{6}", conversion("$0"));


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 ?
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
16
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Chatbour
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
16
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Chatbour
Messages postés
23
Date d'inscription
jeudi 21 juillet 2005
Statut
Membre
Dernière intervention
19 avril 2009
3
Merci
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 :

str = str.replaceAll(sub_str, conversion(sub_str));

Il faut faire :

str = str.replaceFirst(sub_str, conversion(sub_str));

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 !

Merci beaucoup en tout cas, ça marche !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de tenev911
Messages postés
23
Date d'inscription
jeudi 21 juillet 2005
Statut
Membre
Dernière intervention
19 avril 2009
0
Merci
Rah, maintenant que j'ai une réponse je n'ai pas accès à mon ordinateur ^^

J'ai regardé ton code et ca me parrait tout à fait correct.

Tu es mon sauveur, merci :)

Problème résolu !
Commenter la réponse de tenev911
Messages postés
296
Date d'inscription
mardi 22 avril 2008
Statut
Membre
Dernière intervention
18 août 2008
0
Merci
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 !!
Commenter la réponse de Liverion
Messages postés
23
Date d'inscription
jeudi 21 juillet 2005
Statut
Membre
Dernière intervention
19 avril 2009
0
Merci
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 :)


Liverion, merci mais ça ne marche pas ^^
Commenter la réponse de tenev911
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
16
0
Merci
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
Commenter la réponse de cs_Chatbour