Regex d'anticipation, lookbehind et groupes atomiques
j'ai trouvé ces choses dans mon corps regex mais je n'ai pas la moindre idée de ce que je peux en faire. Est-ce que quelqu'un a des exemples pour que je puisse essayer de comprendre comment ils fonctionnent?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
3 réponses
Exemples
donne la chaîne foobarbarfoo
:
bar(?=bar) finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar) finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar finds the 2nd bar ("bar" which does not have "foo" before it)
vous pouvez aussi les combiner:
(?<=foo)bar(?=bar) finds the 1st bar ("bar" with "foo" before it and "bar" after it)
Définitions
positif (?=)
trouver l'expression A où l'expression B suit:
A(?=B)
négatif (?!)
trouver l'expression A où l'expression B fait ne pas suivre:
A(?!B)
Regarder derrière positive (?<=)
trouver l'expression A où l'expression B précède:
(?<=B)A
Regarder derrière négatif (?<!)
trouver l'expression A où l'expression B ne précède pas:
(?<!B)A
groupes atomiques (?>)
un groupe atomique est un groupe non-capturant qui sort du groupe et jette toutes les alternatives après le premier match du modèle à l'intérieur du groupe, donc le retracage est désactivé.
un groupe non-atomique va permettre le backtracking, il va encore trouver la première correspondance, puis si la correspondance en avant échoue, il va revenir en arrière et trouver la prochaine correspondance, jusqu'à ce qu'une correspondance pour l'expression entière soit trouvée ou toutes les possibilités sont épuisées.
-
un groupe non atomique dans le l'expression
(foo|foot)s
appliqué àfoots
:- correspondent à sa 1ère alternative
foo
, puis échouent commes
ne suit pas immédiatement dansfoots
, et revenir en arrière à sa 2ème alternative; - correspond à sa 2e alternative
foot
, puis succède às
suit immédiatement dansfoots
, et s'arrête.
- correspondent à sa 1ère alternative
-
atomique en groupe l'expression
(?>foo|foot)s
appliquée àfoots
correspondra à sa 1ère alternativefoo
, puis échouera cars
ne suit pas immédiatement, et s'arrêtera car le retracage est désactivé.
Certaines ressources
Lookarounds sont à zéro, la largeur des assertions. Ils vérifient un regex (vers la droite ou la gauche de la position actuelle - basé sur l'avant ou derrière), réussit ou échoue quand une correspondance est trouvée (basé sur si elle est positive ou négative) et écarte la partie appariée. Ils ne consomment aucun caractère - l'appariement pour regex les Suivant (s'il y en a), commencera à la même position du curseur.
Lire regular-expression.info pour plus de détails.
- anticipation Positif:
syntaxe:
(?=REGEX_1)REGEX_2
correspond seulement si REGEX_1 correspond; après avoir comparé REGEX_1, la correspondance est rejetée et la recherche de REGEX_2 commence à la même position.
exemple:
(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}
REGEX_1 est [a-z0-9]{4}$
qui correspond à quatre caractères alphanumériques suivis d'une fin de ligne.
REGEX_2 is [a-z]{1,2}[0-9]{2,3}
, qui correspond à une ou deux lettres suivies de deux ou trois chiffres.
REGEX_1 s'assure que la longueur de la chaîne est bien 4, mais ne consomme aucun caractère de sorte que la recherche de REGEX_2 commence au même endroit. Maintenant REGEX_2 s'assure que la chaîne de caractères correspond à d'autres règles. Sans regard vers l'avant, il correspondrait à des cordes de longueur trois ou cinq.
- lookahead négatif
syntaxe:
(?!REGEX_1)REGEX_2
ne correspond que si REGEX_1 ne correspond pas; après avoir coché REGEX_1, la recherche de REGEX_2 commence à la même position.
exemple:
(?!.*\bFWORD\b)\w{10,30}$
la partie look-ahead vérifie pour le FWORD
dans la chaîne et échoue si elle le trouve. Si elle ne trouve pas FWORD
, le look-ahead réussit et la partie suivante vérifie que la longueur de la chaîne est entre 10 et 30 et qu'elle ne contient que des mots caractères a-zA-Z0-9_
Look-behind est similaire à look-ahead: il regarde juste derrière la position actuelle du curseur. Certaines saveurs regex comme javascript ne supporte pas les assertions look-behind. Et la plupart des saveurs qui le supportent (PHP, Python etc) exigent que la portion look-behind ait une longueur fixe.
- les groupes atomiques rejettent/oublient les tokens suivants dans le groupe une fois qu'un token correspond. Consultez cette page pour des exemples de groupes atomiques
Grokking lookaround rapidly.
Comment distinguer lookahead et lookbehind?
Prenez 2 minutes de tour avec moi:
(?=) - positive lookahead
(?<=) - positive lookbehind
Supposons que
A B C #in a line
maintenant, nous demandons B, Où es-tu?
B a deux solutions pour le déclarer:
un, B a une ahead et a c bebind
Deux, B est devant (lookahead) de C et derrière (lookhehind) A.
comme nous pouvons le voir, l'arrière et l'avant sont opposés dans les deux solutions.
Regex est la solution 2.