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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow