314 votes

Regex lookahead, lookbehind et groupes atomiques

J'ai trouvé ces choses dans mon corps de regex mais je n'ai pas la moindre idée de ce que je peux les utiliser? Est-ce que quelqu'un a des exemples pour que je puisse comprendre comment ils fonctionnent?

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

(?>) - atomic group
 

1052voto

skyfoot Points 3480

compte tenu de la chaîne de caractères foobarbarfoo

bar(?=bar)     finds the first bar.
bar(?!bar)     finds the second bar.
(?<=foo)bar    finds the first bar.
(?<!foo)bar    finds the second bar.

vous pouvez également les combiner

(?<=foo)bar(?=bar)    finds the first bar.

Regardez devant Positive(?=)

Trouver Une expression où l'expression B suit

  • A(?=B)

Regardez devant Négatif(?!)

Trouver Une expression où l'expression B ne suit pas

  • A(?!B)

Regarder derrière Positive(?<=)

Trouver Une expression où l'expression B précède

  • (?<=B)A

Regarder derrière Négatif(?<!)

Trouver Une expression où l'expression B n'a pas le précède

  • (?<!B)A

224voto

Amarghosh Points 33957

Lookarounds sont à zéro, la largeur des assertions. La vérification pour un regex (vers la droite ou la gauche de la position actuelle à base de devant ou de derrière), réussit ou échoue lorsqu'une correspondance est trouvée (en fonction de si il est positif ou négatif) et les rejets correspondant à la partie. Ils ne consomment pas n'importe quel caractère - la correspondance pour la regex suivante (le cas échéant), commencera à la même position du curseur.

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

  • Anticipation positif:

Syntaxe:

(?=REGEX_1)REGEX_2

Match seulement si REGEX_1 matchs; après la mise en correspondance REGEX_1, le match est annulé 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}$ ce qui correspond à quatre caractères alphanumériques suivi par la fin de la ligne.
REGEX_2 est - [a-z]{1,2}[0-9]{2,3} qui correspond à un ou deux lettres suivies de deux ou trois chiffres.

REGEX_1 permet de s'assurer que la longueur de la chaîne est en effet 4, mais ne consomment pas tous les caractères, de sorte que la recherche de la REGEX_2 commence au même endroit. Maintenant REGEX_2 permet de s'assurer que la chaîne de caractères correspondant à certains autres règles. Sans look-ahead, il pourrait correspondre à des chaînes de longueur trois ou cinq.

  • Anticipation négatif

Syntaxe:

(?!REGEX_1)REGEX_2

Match seulement si REGEX_1 ne correspondent pas; après vérification REGEX_1, la recherche de REGEX_2 commence à la même position.

exemple:

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

Le " look-ahead partie vérifie l' FWORD dans la chaîne et échoue si elle le trouve. Si il ne trouve pas d' 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'il ne contient que des caractères de mot a-zA-Z0-9_

Regardez-derrière est similaire à "look-ahead": il semble juste derrière la position actuelle du curseur. Certains regex saveurs comme le javascript ne supporte pas de regarder derrière des affirmations. Et la plupart des saveurs qui le prennent en charge (PHP, Python, etc) exiger que cherchez-derrière portion d'avoir une longueur fixe.

  • Groupes atomiques essentiellement les rejets oublie ultérieure des jetons dans le groupe une fois qu'un jeton de matchs. Consultez cette page pour des exemples de groupes atomiques

4voto

Mark Byers Points 318575

Vous pouvez trouver une description détaillée en suivant ces liens:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X