J'ai trouvé ces choses dans mon corps d'expression régulière, mais je n'ai aucune idée de la raison pour laquelle je peux les utiliser. Quelqu'un a-t-il des exemples pour que je puisse essayer de comprendre comment ils fonctionnent?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
regex
lookaround
Spidfire
la source
la source
Réponses:
Exemples
Étant donné la chaîne
foobarbarfoo
:Vous pouvez également les combiner:
Définitions
Un regard positif sur l'avenir
(?=)
Trouvez l'expression A où l'expression B suit:
Regardez vers l'avenir négatif
(?!)
Trouvez l'expression A où l'expression B ne suit pas:
Regardez derrière positif
(?<=)
Rechercher l'expression A où l'expression B précède:
Regardez derrière le négatif
(?<!)
Rechercher l'expression A où l'expression B ne précède pas:
Groupes atomiques
(?>)
Un groupe atomique quitte un groupe et jette des motifs alternatifs après le premier motif correspondant à l'intérieur du groupe (le retour arrière est désactivé).
(?>foo|foot)s
appliquéfoots
correspondra à sa 1ère alternativefoo
, puis échouera cars
il ne suit pas immédiatement et s'arrêtera car le retour arrière est désactivéUn groupe non atomique permettra le retour en arrière; si la correspondance suivante échoue, elle fera marche arrière et utilisera des modèles alternatifs jusqu'à ce qu'une correspondance pour l'expression entière soit trouvée ou que toutes les possibilités soient épuisées.
(foo|foot)s
appliqué aufoots
testament:foo
, puis échouer cars
il ne suit pas immédiatementfoots
, et revenir à sa 2ème alternative;foot
, puis réussir commes
suit immédiatementfoots
et arrêter.Quelques ressources
Testeurs en ligne
la source
Les contournements sont des assertions de largeur nulle. Ils recherchent une expression régulière (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 (selon qu'elle est positive ou négative) et rejette la partie correspondante. Ils ne consomment aucun caractère - la correspondance pour l'expression régulière qui les suit (le cas échéant), commencera à la même position du curseur.
Lisez regular-expression.info pour plus de détails.
Syntaxe:
Correspondance uniquement si REGEX_1 correspond; après avoir correspond à REGEX_1, la correspondance est annulée et la recherche de REGEX_2 commence à la même position.
exemple:
REGEX_1
[a-z0-9]{4}$
correspond à quatre caractères alphanumériques suivis de la fin de la ligne.REGEX_2
[a-z]{1,2}[0-9]{2,3}
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 emplacement. 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.
Syntaxe:
Correspondance uniquement si REGEX_1 ne correspond pas; après avoir vérifié REGEX_1, la recherche de REGEX_2 commence à la même position.
exemple:
La partie d'anticipation vérifie la
FWORD
dans la chaîne et échoue si elle la trouve. S'il ne le trouve pasFWORD
, l'anticipation réussit 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 de mota-zA-Z0-9_
L'arrière-plan est similaire à l'anticipation: il regarde juste derrière la position actuelle du curseur. Certaines saveurs d'expression régulière comme javascript ne prennent pas en charge les assertions de recherche. Et la plupart des saveurs qui le prennent en charge (PHP, Python, etc.) nécessitent que cette partie en regard ait une longueur fixe.
la source
(?=REGEX_1)REGEX_2
ne correspondrait que siREGEX_2
vient aprèsREGEX_1
?Grokking lookaround rapidement.
Comment distinguer l'anticipation et l'antériorité? Faites une visite de 2 minutes avec moi:
Supposer
Maintenant, nous demandons à B, où êtes-vous?
B a deux solutions pour déclarer son emplacement:
Un, B a A devant et C est lié
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 Deux.
la source