web-dev-qa-db-fra.com

Regex lookahead, lookbehind et groupes atomiques

J'ai trouvé ces choses dans mon corps de regex mais je ne sais pas comment je peux les utiliser pour ... Est-ce que quelqu'un a des exemples pour que je puisse essayer de comprendre leur fonctionnement?

(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind

(?>) - atomic group
315
Spidfire

Exemples

Étant donné 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

Regardez devant vous (?=) positif

Recherchez l'expression A, où l'expression B suit:

A(?=B)

Regardez devant vous (?!) négatif

Recherchez l'expression A où l'expression B ne suit pas:

A(?!B)

Regardez derrière (?<=) positif

Rechercher l'expression A où l'expression B précède:

(?<=B)A

Regardez derrière le (?<!) négatif

Rechercher l'expression A où l'expression B ne précède pas:

(?<!B)A

Groupes atomiques (?>)

Un groupe atomique quitte un groupe et jette les modèles alternatifs après le modèle correspondant first à l'intérieur du groupe (le retour en arrière est désactivé).

  • (?>foo|foot)s appliqué à foots correspondra à sa première alternative foo, puis échouera car s ne suit pas immédiatement et s'arrête car le retour en arrière est désactivé

Un groupe non atomique permettra le retour en arrière; si la correspondance suivante échoue, elle effectuera un retour en arrière et utilisera d'autres modèles jusqu'à ce qu'une correspondance soit trouvée pour l'expression entière ou que toutes les possibilités soient épuisées.

  • (foo|foot)s appliqué à foots va:

    1. associez sa 1ère alternative foo, puis échouez car s ne suit pas immédiatement foots, et revenez à sa 2e alternative;
    2. correspond à sa 2ème alternative foot, puis réussissez car s suit immédiatement dans foots et arrêtez-vous.

Quelques ressources

617
skyfoot

Les repères sont des assertions de largeur nulle. Ils vérifient la présence d'une expression rationnelle (vers la droite ou la gauche de la position actuelle - en fonction de l'avant ou de l'arrière), réussissent ou échouent lorsqu'une correspondance est trouvée (qu'elle soit positive ou négative) et rejette la partie correspondante. Ils ne consomment aucun caractère - la correspondance pour les expressions rationnelles qui les suivent (le cas échéant) commence à la même position du curseur. 

Lisez regular-expression.info pour plus de détails.

  • Regard positif: 

Syntaxe:

(?=REGEX_1)REGEX_2

Ne correspond que si REGEX_1 correspond; après la mise en correspondance de REGEX_1, la correspondance est ignoré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 de fin de ligne.
REGEX_2 est [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 afin que la recherche de REGEX_2 commence au même endroit. Maintenant, REGEX_2 s'assure que la chaîne correspond à d'autres règles. Sans anticipation, il correspondrait à des chaînes de longueur trois ou cinq.

  • Regard négatif

Syntaxe:

(?!REGEX_1)REGEX_2

Ne correspond que si REGEX_1 ne correspond pas; après vérification de REGEX_1, la recherche de REGEX_2 commence à la même position.

exemple:

(?!.*\bFWORD\b)\w{10,30}$

La partie d'anticipation recherche la FWORD dans la chaîne et échoue si elle la trouve. S'il ne trouve pas FWORD, la recherche anticipée aboutit et la partie suivante vérifie que la longueur de la chaîne est comprise entre 10 et 30 et qu'elle ne contient que des caractères Word a-zA-Z0-9_

Regarder en arrière est similaire à regarder en avant: il se contente de regarder derrière la position actuelle du curseur. Certaines variantes de regex telles que javascript ne prennent pas en charge les assertions de recherche postérieure. Et la plupart des versions qui le prennent en charge (PHP, Python, etc.) exigent que cette partie de suivi ait une longueur fixe.

  • Les groupes atomiques rejettent/oublient les jetons suivants dans le groupe une fois qu'un jeton correspond. Consultez cette page pour des exemples de groupes atomiques
199
Amarghosh

Grokking regarde rapidement.
Comment distinguer l'anticipation et l'observation en arrière? Faites un tour de 2 minutes avec moi:

(?=) - positive lookahead
(?<=) - positive lookbehind

Supposer 

    A  B  C #in a line

Maintenant, nous demandons à B, où es-tu?
B a deux solutions pour déclarer son emplacement: 

Un, B a A devant et a C bebind
Deux, B est devant (regard d'avance) de C et derrière (derrière) A. 

Comme on peut le constater, l’arrière et l’avant sont opposés dans les deux solutions.
Regex est la solution deux. 

0
JawSaw