Regular Expressions
Lookahead och Lookbehind
Sök…
Syntax
- Positiv lookahead:
(?=pattern)
- Negativ lookahead:
(?!pattern)
- Positiv utseende :
(?<=pattern)
- Negativt utseende :
(?<!pattern)
Anmärkningar
Stöds inte av alla regex-motorer.
Dessutom begränsar många regex-motorer mönstren i lookbehinds till sträng med fast längd. Till exempel ska mönstret (?<=a+)b
aaab
(?<=a+)b
matcha b
i aaab
men kastar ett fel i Python.
Att fånga grupper är tillåtna och fungera som förväntat, inklusive backreferenser. Lookahead / lookbehind själv är dock inte en fångargrupp.
Grunderna
En positiv lookahead (?=123)
hävdar att texten följs av det givna mönstret utan att inkludera mönstret i matchen. På liknande sätt hävdar en positiv lookbehind (?<=123)
att texten föregås av det givna mönstret. Ersätta =
med !
förnekar påståendet.
Ingång : 123456
-
123(?=456)
matchar123
( positiv lookahead ) -
(?<=123)456
matchar456
( positivt utseende ) -
123(?!456)
misslyckas ( negativ lookahead ) -
(?<!123)456
misslyckas ( negativt utseende )
Ingång : 456
-
123(?=456)
misslyckas -
(?<=123)456
misslyckas -
123(?!456)
misslyckas -
(?<!123)456
matchningar456
Använd lookbehind för att testa avslut
En lookbehind kan användas i slutet av ett mönster för att säkerställa att det slutar eller inte på ett visst sätt.
([az ]+|[AZ ]+)(?<! )
matchar sekvenser med endast gemener eller endast versaler med undantag för efterföljande mellanrum.
Simulera utseende med variabel längd med \ K
Vissa regex-smaker (Perl, PCRE, Oniguruma, Boost) stöder endast utseende med fast längd, men erbjuder funktionen \K
, som kan användas för att simulera utseende med variabel längd i början av ett mönster. När man möter a \K
, kasseras den matchade texten fram till denna punkt, och endast den text som matchar den del av mönstret som följer \K
förvaras i slutresultatet.
ab+\Kc
Är ekvivalent med:
(?<=ab+)c
I allmänhet ett mönster av formen:
(subpattern A)\K(subpattern B)
Slutar med att likna:
(?<=subpattern A)(subpattern B)
Förutom när B-mönstret kan matcha samma text som A-mönstret - du kan sluta med subtilt olika resultat, eftersom A-mönstret fortfarande konsumerar texten, till skillnad från ett riktigt utseende.