2 votes

Extraction d'une sous-chaîne à l'aide de Matcher : java.lang.IllegalStateException : Aucune correspondance trouvée

J'essaie d'utiliser des expressions rationnelles pour extraire une sous-chaîne d'une chaîne donnée. Je le fais en Scala :

val pattern = Pattern.compile("(Word)+")
val matcher = pattern.matcher("WordWordRestOfString")
matcher.group(1)

Le résultat souhaité est "WordWord", mais j'obtiens toujours une exception "IllegalStateException". Je n'ai pas vraiment travaillé avec Regex auparavant, et je ne peux pas comprendre complètement comment la méthode matcher.group fonctionne, mais j'ai vu des réponses à des questions suggérant l'utilisation de matcher.group(1).

2voto

Wiktor Stribiżew Points 100073

Tout d'abord, le groupe de capture répétée ne conserve que la dernière valeur capturée dans la mémoire tampon du groupe. Word comme valeur du groupe 1. Voir le Répétition d'un groupe de capture vs. capture d'un groupe répété .

Deuxièmement, vous n'appelez pas réellement le matcheur .find o .matches qui déclenchent la recherche par expressions rationnelles.

Troisièmement, il n'est pas nécessaire d'obtenir la valeur du groupe 1, il suffit d'obtenir une correspondance complète :

val s = "WordWordRestOfStringWordWordWord"
val pattern = "(Word)+".r
// Single result:
val result = pattern.findFirstMatchIn(s).get
println(result) // => WordWord
// Multiple results:
val multiple_results = pattern.findAllMatchIn(s)
println(multiple_results.mkString(", ")) // => WordWord, WordWordWord

Voir le Démonstration Scala

0voto

Arvind Kumar Avinash Points 49501

Si j'utilise group() au lieu de group(1) Je ne rencontre aucun problème pour obtenir le résultat souhaité en Java. Je ne connais pas Scala, mais je pense qu'un code Java devrait fonctionner de la même manière qu'en Scala.

import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        var pattern = Pattern.compile("(Word)+");
        var matcher = pattern.matcher("WordWordRestOfString");
        if (matcher.find()) {
            System.out.println(matcher.group());
        }
    }
}

Salida:

WordWord

Vous pouvez vérifier cet excellent tutoriel sur Regex, par Oracle .

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