Capture et regroupement
Le groupe de capture (pattern)
crée un groupe qui possède une propriété de capture .
Un autre associé que vous pourriez souvent voir (et utiliser) est (?:pattern)
, qui crée un groupe sans capturer de propriété, donc nommé non capturant .
Un groupe est généralement utilisé lorsque vous devez répéter une séquence de motifs, par exemple (\.\w+)+
, ou pour spécifier où l'alternance doit prendre effet, par exemple ^(0*1|1*0)$
( ^
, alors 0*1
ou 1*0
, alors $
) versus ^0*1|1*0$
( ^0*1
ou1*0$
).
Un groupe de capture, en dehors du regroupement, enregistrera également le texte correspondant au motif à l'intérieur du groupe de capture (pattern)
. En utilisant votre exemple, (.*):
, .*
matchs ABC
et :
matchs :
, et depuis .*
est à l' intérieur groupe capture (.*)
, le texte ABC
est enregistré pour le groupe de capture 1.
Numéro de groupe
Le motif entier est défini comme étant le groupe numéro 0.
Tout groupe de capture dans le modèle commence l'indexation à partir de 1. Les indices sont définis par l'ordre de parenthèses ouvrantes des groupes de capture . À titre d'exemple, voici les 5 groupes de capture dans le modèle ci-dessous:
(group)(?:non-capturing-group)(g(?:ro|u)p( (nested)inside)(another)group)(?=assertion)
| | | | | | || | |
1-----1 | | 4------4 |5-------5 |
| 3---------------3 |
2-----------------------------------------2
Les numéros de groupe sont utilisés en référence arrière \n
dans le modèle et $n
dans la chaîne de remplacement.
Dans d'autres saveurs de regex (PCRE, Perl), ils peuvent également être utilisés dans les appels de sous-routine .
Vous pouvez accéder au texte correspondant à certains groupes avec Matcher.group(int group)
. Les numéros de groupe peuvent être identifiés avec la règle indiquée ci-dessus.
Dans certaines versions de regex (PCRE, Perl), il existe une fonction de réinitialisation de branche qui vous permet d'utiliser le même numéro pour capturer des groupes dans différentes branches d'alternance .
Nom de groupe
À partir de Java 7, vous pouvez définir un groupe de capture nommé (?<name>pattern)
et accéder au contenu correspondant àMatcher.group(String name)
. L'expression régulière est plus longue, mais le code est plus significatif, car il indique ce que vous essayez de faire correspondre ou d'extraire avec l'expression régulière.
Les noms de groupe sont utilisés en back-reference \k<name>
dans le pattern et${name}
dans la chaîne de remplacement.
Les groupes de capture nommés sont toujours numérotés avec le même schéma de numérotation, de sorte qu'ils sont également accessibles via Matcher.group(int group)
.
En interne, l'implémentation de Java correspond simplement du nom au numéro de groupe. Par conséquent, vous ne pouvez pas utiliser le même nom pour 2 groupes de capture différents.