69 votes

Java Regex Remplacer par un groupe de capture

Est-il possible de remplacer une expression régulière en cas de modification du contenu de la capture de groupe?

Exemple:

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher(text);
resultString = regexMatcher.replaceAll("$1"); // *3 ??

Et j'aimerais remplacer toute occurrence de 1 $multiplié par 3.

edit:

Ressemble, quelque chose ne va pas :(

Si j'utilise

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher("12 54 1 65");
try {
    String resultString = regexMatcher.replaceAll(regexMatcher.group(1));
} catch (Exception e) {
    e.printStackTrace();
}

Elle lève une exception IllegalStateException: Pas de match trouvé

Mais

Pattern regex = Pattern.compile("(\\d{1,2})");
Matcher regexMatcher = regex.matcher("12 54 1 65");
try {
    String resultString = regexMatcher.replaceAll("$1");
} catch (Exception e) {
    e.printStackTrace();
}

fonctionne très bien, mais je ne peux pas changer le $1 :(

edit:

Maintenant, ça fonctionne :)

76voto

earl Points 10428

Comment à ce sujet:

if (regexMatcher.find()) {
    resultString = regexMatcher.replaceAll(
            String.valueOf(3 * Integer.parseInt(regexMatcher.group(1))));
}

Pour obtenir le premier match, utiliser #find(). Après cela, vous pouvez utiliser #group(1) pour se référer à ce premier match, et remplacer tous les matches par la première maches valeur multipliée par 3.

Et dans le cas où vous souhaitez remplacer chaque match avec qui correspondent à la valeur multipliée par 3:

    Pattern p = Pattern.compile("(\\d{1,2})");
    Matcher m = p.matcher("12 54 1 65");
    StringBuffer s = new StringBuffer();
    while (m.find())
        m.appendReplacement(s, String.valueOf(3 * Integer.parseInt(m.group(1))));
    System.out.println(s.toString());

Vous pouvez regarder à travers l' Matcher's de la documentation, où ceci et beaucoup plus de choses est couvert en détail.

11voto

Draemon Points 15448

La réponse de Earl vous donne la solution, mais je pensais ajouter le problème qui cause votre IllegalStateException . Vous appelez group(1) sans avoir au préalable appelé une opération de mise en correspondance (telle que find() ). Cela n'est pas nécessaire si vous utilisez simplement $1 puisque le replaceAll() est l'opération correspondante.

7voto

John O Points 1018

Il y a un exemple sur cette page de JavaPractices.com - voir le deuxième exemple, "Remplacement dynamique".

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: