Capturer et grouper
Groupe de capture (pattern)
crée un Groupe qui a une propriété de capture.
Un autre groupe connexe que vous pourriez souvent voir (et utiliser) est (?:pattern)
, qui crée un Groupe sans propriété de capture, donc nommé Groupe non capturant.
Un groupe est généralement utilisé lorsque vous avez besoin de 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)$
(^
, puis 0*1
ou 1*0
, puis $
) versus ^0*1|1*0$
(^0*1
ou 1*0$
).
Un groupe de capture, mis à part le groupement, enregistrera également le texte correspondant au motif à l'intérieur du groupe de capture (pattern)
. En utilisant votre exemple, (.*):
, .*
correspond à ABC
et :
correspond à :
, et puisque .*
est à l'intérieur du groupe de capture (.*)
, le texte ABC
est enregistré pour le groupe de capture 1.
Numéro de groupe
L'ensemble du motif est défini comme étant le groupe numéro 0.
Tout groupe de capture dans le motif commence l'indexation à partir de 1. Les indices sont définis par l'ordre des parenthèses ouvrantes des groupes de capture. Par exemple, voici tous les 5 groupes de capture dans le motif 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 dans les back-references \n
dans le motif et $n
dans la chaîne de remplacement.
Dans d'autres variantes d'expressions régulières (PCRE, Perl), ils peuvent également être utilisés dans des appels de sous-routine.
Vous pouvez accéder au texte correspondant à un certain groupe avec Matcher.group(int group)
. Les numéros de groupe peuvent être identifiés avec la règle énoncée ci-dessus.
Dans certaines variantes d'expressions régulières (PCRE, Perl), il existe une fonctionnalité de réinitialisation de branche qui vous permet d'utiliser le même nombre pour les groupes de capture dans différentes branches d'alternance.
Nom de groupe
À partir de Java 7, vous pouvez définir un Groupe de capture nommé (?pattern)
, et vous pouvez accéder au contenu correspondant avec 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 dans les back-references \k
dans le motif et ${name}
dans la chaîne de remplacement.
Les groupes de capture nommés sont toujours numérotés selon le même schéma de numérotation, donc ils peuvent également être accédés via Matcher.group(int group)
.
En interne, l'implémentation de Java mappe simplement le nom sur le numéro de groupe. Par conséquent, vous ne pouvez pas utiliser le même nom pour 2 groupes de capture différents.