Pour mieux comprendre, appliquons les trois expressions plus un groupe de capture et analysons chaque comportement.
()
groupe de capture - l'expression régulière à l'intérieur des parenthèses doit être mise en correspondance et la correspondance crée un groupe de capture
(?:)
groupe non capturant - l'expression régulière à l'intérieur de la parenthèse doit correspondre mais ne crée pas le groupe de capture
(?=)
positive look ahead - affirme que l'expression régulière doit être mise en correspondance
(?!)
look négatif - affirme qu'il est impossible de faire correspondre l'expression régulière
Appliquons q(u)i
pour arrêter . q
correspond à q et le groupe de capture u
correspond à u . La correspondance à l'intérieur du groupe de capture est prise et un groupe de capture est créé. Le moteur continue donc i
. Et i
correspondra à i . Cette dernière tentative de match est réussie. qui est mis en correspondance et un groupe de capture avec u est créé.
Appliquons q(?:u)i
pour arrêter . Encore une fois, q
correspond à q et le groupe non capturant u
correspond à u . La correspondance du groupe de non-capture est prise, mais le groupe de capture n'est pas créé. Le moteur continue donc i
. Et i
correspondra à i . Cette dernière tentative de match est réussie. qui correspond
Appliquons q(?=u)i
pour arrêter . La recherche anticipée est positive et est suivie d'un autre jeton. Encore une fois, q
correspond à q et u
correspond à u . Encore une fois, la correspondance de l'anticipation doit être rejetée, de sorte que le moteur revient de i
la chaîne à u . Le lookahead a réussi, donc le moteur continue i
. Mais i
peut ne pas correspondre u . Donc, cette tentative de match échoue.
Appliquons q(?=u)u
pour arrêter . La recherche anticipée est positive et est suivie d'un autre jeton. Encore une fois, q
correspond à q et u
correspond à u . La correspondance de l'anticipation doit être ignorée, de sorte que le moteur revient de u
la chaîne à u . Le lookahead a réussi, donc le moteur continue u
. Et u
correspondra u . Donc cette tentative de match est réussie. qu est apparié
Appliquons q(?!i)u
pour arrêter . Même dans ce cas, la recherche anticipée est positive (car i
ne correspond pas) et est suivie d'un autre jeton. Encore une fois, q
correspond à q et i
ne correspond pas à u . La correspondance de l'anticipation doit être ignorée, de sorte que le moteur revient de u
la chaîne à u . Le lookahead a réussi, donc le moteur continue u
. Et u
correspondra u . Donc cette tentative de match est réussie. qu est apparié
Donc, en conclusion, la vraie différence entre les groupes lookahead et non-captur est de savoir si vous voulez simplement tester l'existence ou tester et enregistrer la correspondance. Les groupes de capture sont chers alors utilisez-les judicieusement.