Qu’est-ce qu’un regex «groupe de capture indépendant»?

À partir 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 non capturant

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

Cela signifie que le regroupement est atomique et qu’il renferme des informations de retour en arrière pour un groupe correspondant. Donc, cette expression est possessive; il ne recule pas même si c’est le seul moyen pour la regex dans son ensemble de réussir. C’est “indépendant” dans le sens où il ne coopère pas, via le backtracking, avec d’autres éléments de la regex pour assurer une correspondance.

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 de O’Reilly.

Je pense que ce tutoriel explique exactement ce que «groupe indépendant non capturant» ou «groupement atomique» est

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

Lorsqu’elles sont appliquées à abc , les deux expressions régulières vont correspondre à a , bc à bc , puis c ne correspondra pas à la fin de la chaîne. Ici, leurs chemins divergent. Le regex avec le groupe de capture a mémorisé une position de retour arrière pour l’alternance. Le groupe abandonne son match, b puis correspond aux matchs b et c c . Match trouvé!

Le regex avec le groupe atomique , cependant, est sorti d’un groupe atomique après que bc été apparié. À ce stade, toutes les positions de retour 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 de la chaîne est ignorée. En conséquence, lorsque c échoue, le moteur regex n’a plus d’alternative à essayer.

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