121 votes

Puis-je remplacer des groupes dans Java regex ?

J'ai ce code, et je veux savoir, si je peux remplacer uniquement les groupes (pas tous les modèles) dans Java regex. Code :

 //...
 Pattern p = Pattern.compile("(\\d).*(\\d)");
    String input = "6 example input 4";
    Matcher m = p.matcher(input);
    if (m.find()) {

        //Now I want replace group one ( (\\d) ) with number 
       //and group two (too (\\d) ) with 1, but I don't know how.

    }

68voto

acdcjunior Points 19898

Vous pouvez utiliser Matcher#start(group) et Matcher#end(group) pour construire une méthode de remplacement générique :

public static String replaceGroup(String regex, String source, int groupToReplace, String replacement) {
    return replaceGroup(regex, source, groupToReplace, 1, replacement);
}

public static String replaceGroup(String regex, String source, int groupToReplace, int groupOccurrence, String replacement) {
    Matcher m = Pattern.compile(regex).matcher(source);
    for (int i = 0; i < groupOccurrence; i++)
        if (!m.find()) return source; // pattern not met, may also throw an exception here
    return new StringBuilder(source).replace(m.start(groupToReplace), m.end(groupToReplace), replacement).toString();
}

public static void main(String[] args) {
    // replace with "%" what was matched by group 1 
    // input: aaa123ccc
    // output: %123ccc
    System.out.println(replaceGroup("([a-z]+)([0-9]+)([a-z]+)", "aaa123ccc", 1, "%"));

    // replace with "!!!" what was matched the 4th time by the group 2
    // input: a1b2c3d4e5
    // output: a1b2c3d!!!e5
    System.out.println(replaceGroup("([a-z])(\\d)", "a1b2c3d4e5", 2, 4, "!!!"));
}

Vérifiez la démo en ligne ici.

3voto

mkb Points 7558

Ajoutez un troisième groupe en ajoutant des parens autour de ".*", puis remplacez la sous-séquence par "number" + m.group(2) + "1". par exemple :

String output = m.replaceFirst("number" + m.group(2) + "1");

3voto

ydanneg Points 31

Vous pouvez utiliser les méthodes matcher.start () etmatcher.end () pour obtenir les positions du groupe. Ainsi, en utilisant ces positions, vous pouvez facilement remplacer n'importe quel texte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X