62 votes

Qu'est-ce qu'un groupe non capturant indépendant de regex ?

De la documentation Java 6 Pattern:

Constructions spéciales (non capturantes)

(?:X)   X, en tant que groupe non capturant

(?>X)   X, en tant que groupe indépendant et non capturant

Entre (?:X) et (?>X), quelle est la différence? Que signifie indépendant dans ce contexte?

48voto

erickson Points 127945

Cela signifie que le regroupement est atomique et qu'il élimine les informations de retour en arrière pour un groupe correspondant. Ainsi, cette expression est possessive; elle ne reculera pas même si c'est le seul moyen pour l'expression régulière dans son ensemble de réussir. Elle est "indépendante" dans le sens où elle ne coopère pas, via le retour en arrière, avec d'autres éléments de l'expression régulière pour garantir une correspondance.

14voto

kajibu Points 124

Je pense que ce tutoriel explique ce qu'est exactement un "groupe indépendant non capturant" ou un "groupement atomique"

L'expression régulière a(bc|b)c (groupe capturant) correspond à abcc et abc. L'expression régulière a(?>bc|b)c (groupe atomique) correspond à abcc mais pas à abc.

Lorsqu'elle est appliquée à abc, les deux expressions régulières correspondront a à a, bc à bc, puis c ne correspondra pas à la fin de la chaîne. À ce stade, leurs chemins divergent. L'expression régulière avec le groupe capturant a retenue une position de retour en arrière pour l'alternance. Le groupe va abandonner son match, b va correspondre à b puis c correspondra à c. Match trouvé!

L'expression régulière avec le groupe atomique, cependant, a quitté un groupe atomique après que bc ait été trouvé. À ce stade, toutes les positions de retour en arrière pour les jetons à l'intérieur du groupe sont supprimées. Dans cet exemple, l'option d'alternance pour essayer b à la deuxième position dans la chaîne est abandonnée. Par conséquent, lorsque c échoue, le moteur d'expressions régulières n'a plus d'alternatives à essayer.

6voto

Si vous avez foo(?>(co)*)co, cela ne correspondra jamais. Je suis sûr qu'il existe des exemples pratiques de quand cela serait utile, essayez le livre d'O'Reilly.

-1voto

jobard Points 11

(?>X)[?/*/+] est la même que (?:X)[?/*/+]+.

-3voto

beibichunai Points 82

(?>X?) équivaut à (?:X)?+, (?>X*) équivaut à (?:X)*+, (?>X+) équivaut à (?:X)++.

En enlevant le fait que X doit être un groupe non capturant, l'équivalence précédente est :

(?>X?) équivaut à X?+, (?>X*) équivaut à X*+, (?>X+) équivaut à X++.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X