J'ai cherché la signification de ces expressions mais je n'ai pas pu comprendre la différence exacte entre elles. Voici ce qu'ils disent:
?:
Faites correspondre l'expression mais ne la capturez pas.?=
Faites correspondre un suffixe mais excluez-le de la capture.?!
Correspondance si le suffixe est absent.
J'ai essayé de les utiliser dans de simples RegEx et j'ai obtenu des résultats similaires pour tous. exemple: les 3 expressions suivantes donnent des résultats très similaires.
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*
javascript
regex
RK Poddar
la source
la source
*
après les groupes, ils sont donc simplement ignorés.Réponses:
La différence entre
?=
et?!
est que le premier exige que l'expression donnée corresponde et le second ne doit pas correspondre. Par exemplea(?=b)
, correspondra le "a" dans "ab", mais pas le "a" dans "ac". Alors quea(?!b)
correspondra le "a" dans "ac", mais pas le "a" dans "ab".La différence entre
?:
et?=
est que cela?=
exclut l'expression de toute la correspondance tout en?:
ne créant tout simplement pas de groupe de capture. Ainsi, par exemplea(?:b)
, correspondra le "ab" dans "abc", tandis quea(?=b)
ne correspondra qu'au "a" dans "abc".a(b)
correspondrait au "ab" de "abc" et créerait une capture contenant le "b".la source
Veuillez vérifier ici: http://www.regular-expressions.info/lookaround.html pour un très bon tutoriel et des exemples sur lookahead dans les expressions régulières.
la source
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èreAppliquons
q(u)i
pour arrêter .q
correspond à q et le groupe de captureu
correspond à u . La correspondance à l'intérieur du groupe de capture est prise et un groupe de capture est créé. Le moteur continue donci
. Eti
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 capturantu
correspond à u . La correspondance du groupe de non-capture est prise, mais le groupe de capture n'est pas créé. Le moteur continue donci
. Eti
correspondra à i . Cette dernière tentative de match est réussie. qui correspondAppliquons
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 etu
correspond à u . Encore une fois, la correspondance de l'anticipation doit être rejetée, de sorte que le moteur revient dei
la chaîne à u . Le lookahead a réussi, donc le moteur continuei
. Maisi
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 etu
correspond à u . La correspondance de l'anticipation doit être ignorée, de sorte que le moteur revient deu
la chaîne à u . Le lookahead a réussi, donc le moteur continueu
. Etu
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 (cari
ne correspond pas) et est suivie d'un autre jeton. Encore une fois,q
correspond à q eti
ne correspond pas à u . La correspondance de l'anticipation doit être ignorée, de sorte que le moteur revient deu
la chaîne à u . Le lookahead a réussi, donc le moteur continueu
. Etu
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.
la source
Essayez de comparer
foobar
avec ceux-ci:La première expression régulière correspondra et renverra «bar» comme premier sous-
(?=b)
match - correspond au «b», mais ne le consomme pas, le laissant pour les parenthèses suivantes.La deuxième regex ne correspondra PAS, car elle s'attend à ce que «foo» soit suivi par quelque chose de différent de «b».
(?:...)
a exactement le même effet que simple(...)
, mais il ne renvoie pas cette partie en tant que sous-correspondance.la source
Le moyen le plus simple de comprendre les assertions est de les traiter comme la commande insérée dans une expression régulière. Lorsque le moteur exécute une assertion, il vérifie immédiatement la condition décrite par l'assertion. Si le résultat est vrai, continuez à exécuter l'expression régulière.
la source
C'est la vraie différence:
Si vous ne vous souciez pas du contenu après "?:" Ou "? =", "?:" Et "? =" Sont exactement les mêmes. Les deux peuvent être utilisés.
Mais si vous avez besoin de ce contenu pour un traitement ultérieur (pas seulement pour correspondre au tout. Dans ce cas, vous pouvez simplement utiliser "a (b)") Vous devez utiliser "? =" À la place. Cause "?:" Sera juste à travers cela loin.
la source