Regular Expressions
Groupement Atomique
Recherche…
Introduction
Les groupes non capturés régulièrement permettent au moteur de ré-entrer dans le groupe et d'essayer de faire correspondre quelque chose de différent (comme une alternance différente ou de faire correspondre moins de caractères lorsqu'un quantificateur est utilisé).
Les groupes atomiques diffèrent des groupes non capturés réguliers en ce sens que le retour en arrière est interdit. Une fois que le groupe est sorti, toutes les informations de retour en arrière sont supprimées, donc aucune autre correspondance ne peut être tentée.
Remarques
Un quantificateur possessif se comporte comme un groupe atomique en ce sens que le moteur ne pourra pas revenir en arrière sur un jeton ou un groupe.
Les fonctionnalités suivantes sont équivalentes, bien que certaines soient plus rapides que d’autres:
a*+abc
(?>a*)abc
(?:a+)*+abc
(?:a)*+abc
(?:a*)*+abc
(?:a*)++abc
Grouper avec (?>)
Utiliser un groupe atomique
Les groupes atomiques ont le format (?>...)
avec un ?>
Après le paren ouvert.
Considérez l'exemple de texte suivant:
ABC
Le regex va tenter de faire correspondre à partir de la position 0 du texte, qui est avant le A
dans ABC
.
Si une expression insensible à la casse (?>a*)abc
était utilisée, le (?>a*)
correspondrait à 1 caractère A
, laissant
BC
comme le reste du texte correspondant. Le groupe (?>a*)
est quitté et abc
est tenté sur le texte restant, qui ne correspond pas.
Le moteur ne peut pas revenir en arrière dans le groupe atomique et la passe en cours échoue. Le moteur passe à la position suivante dans le texte, qui serait à la position 1, qui est après le A
et avant le B
de ABC
.
Le regex (?>a*)abc
est tenté à nouveau, et (?>a*)
correspond à A
0 fois, laissant
BC
comme le reste du texte correspondant. Le groupe (?>a*)
est quitté et abc
est tenté, ce qui échoue.
Encore une fois, le moteur ne peut pas revenir en arrière dans le groupe atomique et la passe en cours échoue. Le regex continuera d'échouer jusqu'à ce que toutes les positions dans le texte aient été épuisées.
Utilisation d'un groupe non atomique
Les groupes réguliers non capturants ont le format (?:...)
avec un ?:
Après le paren ouvert.
Étant donné le même exemple de texte, mais avec l'expression insensible à la casse (?:a*)abc
place, une correspondance aurait lieu car le retour en arrière est autorisé à se produire.
Au début, (?:a*)
consommera la lettre A
dans le texte
ABC
en quittant
BC
comme le reste du texte correspondant. Le groupe (?:a*)
est quitté et abc
est tenté sur le texte restant qui ne correspond pas.
Le moteur revient en arrière dans le groupe (?:a*)
et tente de faire correspondre 1 caractère de moins: au lieu de faire correspondre le caractère 1 A
, il tente de faire correspondre les caractères 0 A
et le groupe (?:a*)
est quitté. Cela laisse
ABC
comme le reste du texte correspondant. Le regex abc
est maintenant capable de correspondre avec succès au texte restant.
Autre exemple de texte
Considérez cet exemple de texte, avec à la fois des groupes atomiques et non atomiques (encore une fois, insensible à la casse):
AAAABC
Le regex tentera de faire correspondre à partir de la position 0 du texte, qui est avant le premier A
de AAAABC
.
Le motif utilisant le groupe atomique (?>a*)abc
ne pourra pas correspondre, se comportant presque de façon identique à l'exemple ABC
ci-dessus: tous les 4 caractères A
sont d'abord associés à (?>a*)
(laissant BC
comme reste du texte à faire correspondre) et abc
ne peut pas correspondre à ce texte. Le groupe ne peut pas être ré-entré, la correspondance échoue.
Le pattern utilisant le groupe non-atomique (?:a*)abc
pourra correspondre, se comportant de la même façon que l'exemple ABC
non-atomique ci-dessus: tous les 4 caractères A
sont d'abord associés à (?:a*)
BC
tant que texte restant à faire correspondre) et abc
ne peut pas correspondre à ce texte. Le groupe est capable d'être rentré, donc une moins A
est tentée: 3 A
caractères sont mis en correspondance à la place de 4 ( en laissant ABC
comme le reste du texte pour correspondre), et abc
est en mesure de correspondre avec succès sur ce texte.