Java Language Utilisation de groupes de capture


Exemple

Si vous devez extraire une partie de la chaîne de la chaîne d'entrée, vous pouvez utiliser des groupes de capture de regex.

Pour cet exemple, nous commencerons par une simple expression de numéro de téléphone:

\d{3}-\d{3}-\d{4}

Si des parenthèses sont ajoutées à l'expression rationnelle, chaque ensemble de parenthèses est considéré comme un groupe de capture . Dans ce cas, nous utilisons ce que l'on appelle des groupes de capture numérotés:

(\d{3})-(\d{3})-(\d{4})
^-----^ ^-----^ ^-----^
Group 1 Group 2 Group 3

Avant de pouvoir l'utiliser en Java, nous ne devons pas oublier de suivre les règles de Strings, en évitant les barres obliques inverses, ce qui entraîne le modèle suivant:

"(\\d{3})-(\\d{3})-(\\d{4})"

Nous devons d'abord compiler le modèle regex pour créer un Pattern , puis nous avons besoin d'un Matcher correspondant à notre chaîne d'entrée avec le pattern:

Pattern phonePattern = Pattern.compile("(\\d{3})-(\\d{3})-(\\d{4})");
Matcher phoneMatcher = phonePattern.matcher("abcd800-555-1234wxyz");

Ensuite, le Matcher doit trouver la première sous-séquence correspondant à l'expression régulière:

phoneMatcher.find();

Maintenant, en utilisant la méthode de groupe, nous pouvons extraire les données de la chaîne:

String number = phoneMatcher.group(0); //"800-555-1234" (Group 0 is everything the regex matched)
String aCode = phoneMatcher.group(1); //"800"
String threeDigit = phoneMatcher.group(2); //"555"
String fourDigit = phoneMatcher.group(3); //"1234"

Remarque: Matcher.group() peut être utilisé à la place de Matcher.group(0) .

Java SE 7

Java 7 a introduit les groupes de capture nommés. Les groupes de capture nommés fonctionnent de la même manière que les groupes de capture numérotés (mais avec un nom au lieu d'un nombre), bien qu'il y ait de légères modifications de syntaxe. L'utilisation de groupes de capture nommés améliore la lisibilité.

Nous pouvons modifier le code ci-dessus pour utiliser des groupes nommés:

(?<AreaCode>\d{3})-(\d{3})-(\d{4})
^----------------^ ^-----^ ^-----^
AreaCode           Group 2 Group 3

Pour obtenir le contenu de "AreaCode", nous pouvons utiliser à la place:

String aCode = phoneMatcher.group("AreaCode"); //"800"