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)ipour arrêter . qcorrespond à q et le groupe de capture ucorrespond à 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 icorrespondra à 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)ipour arrêter . Encore une fois, qcorrespond à q et le groupe non capturant ucorrespond à 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 icorrespondra à i . Cette dernière tentative de match est réussie. qui correspond
Appliquons q(?=u)ipour arrêter . La recherche anticipée est positive et est suivie d'un autre jeton. Encore une fois, qcorrespond à q et ucorrespond à u . Encore une fois, la correspondance de l'anticipation doit être rejetée, de sorte que le moteur revient de ila chaîne à u . Le lookahead a réussi, donc le moteur continue i. Mais ipeut ne pas correspondre u . Donc, cette tentative de match échoue.
Appliquons q(?=u)upour arrêter . La recherche anticipée est positive et est suivie d'un autre jeton. Encore une fois, qcorrespond à q et ucorrespond à u . La correspondance de l'anticipation doit être ignorée, de sorte que le moteur revient de ula chaîne à u . Le lookahead a réussi, donc le moteur continue u. Et ucorrespondra u . Donc cette tentative de match est réussie. qu est apparié
Appliquons q(?!i)upour arrêter . Même dans ce cas, la recherche anticipée est positive (car ine correspond pas) et est suivie d'un autre jeton. Encore une fois, qcorrespond à q et ine correspond pas à u . La correspondance de l'anticipation doit être ignorée, de sorte que le moteur revient de ula chaîne à u . Le lookahead a réussi, donc le moteur continue u. Et ucorrespondra 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.