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
316
demandé sur grenierm5 2010-06-04 14:56:13

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 :

    1. correspondent à sa 1ère alternative foo , puis échouent comme s ne suit pas immédiatement dans foots , et revenir en arrière à sa 2ème alternative;
    2. correspond à sa 2e alternative foot , puis succède à s suit immédiatement dans foots , et s'arrête.
  • atomique en groupe l'expression (?>foo|foot)s appliquée à foots correspondra à sa 1ère alternative foo , puis échouera car s ne suit pas immédiatement, et s'arrêtera car le retracage est désactivé.

Certaines ressources

557
répondu skyfoot 2017-06-21 15:50:25

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
194
répondu Amarghosh 2016-08-24 13:04:31

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.

0
répondu JawSaw 2018-04-15 06:30:55