Regex Lookahead, Lookbehind en Atomic-groepen

Ik vond deze dingen in mijn regex-lichaam, maar ik heb geen idee waar ik ze voor kan gebruiken.
Heeft iemand voorbeelden, dus ik kan proberen te begrijpen hoe ze werken?

(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group

Antwoord 1, Autoriteit 100%

Voorbeelden

Gegeven de string 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)

U kunt ze ook combineren:

(?<=foo)bar(?=bar)    finds the 1st bar ("bar" with "foo" before it and "bar" after it)

Definities

Kijk vooruit POSITIEF (?=)

Zoek expressie A waaruit Expression B volgt:

A(?=B)

Kijk vooraf negatief (?!)

Zoek expressie A waar Expression B niet volgt:

A(?!B)

kijk achter positief (?<=)

Zoek expressie A waaruit Expression B gaat vooraf:

(?<=B)A

Kijk achter Negatief (?<!)

Zoek expressie A waar Expression B niet voorafgaat:

(?<!B)A

Atoomgroepen (?>)

Een atoomgroep verlaat een groep en gooit alternatieve patronen weg na het eersteovereenkomende patroon binnen de groep (terugdraaien is uitgeschakeld).

  • (?>foo|foot)stoegepast op footskomt overeen met het eerste alternatief foo, en mislukt dan als svolgt niet onmiddellijk, en stopt als backtracking is uitgeschakeld

Een niet-atomaire groep maakt backtracking mogelijk; als de daaropvolgende afstemming vooruit mislukt, zal het teruggaan en alternatieve patronen gebruiken totdat een overeenkomst voor de hele uitdrukking is gevonden of alle mogelijkheden zijn uitgeput.

  • (foo|foot)stoegepast op footszullen:

    1. kom overeen met het eerste alternatief foo, faal dan omdat sniet onmiddellijk volgt in foots, en keer terug naar het tweede alternatief;
    2. li>

    3. kom overeen met zijn 2e alternatieve foot, slaag dan als sonmiddellijk volgt op footsen stop.

Enkele bronnen

Online testers


Antwoord 2, autoriteit 21%

Lookarounds zijn nulbreedte beweringen. Ze controleren op een regex (naar rechts of links van de huidige positie – op basis van vooruit of achter), slaagt of mislukt wanneer een overeenkomst wordt gevonden (gebaseerd op als het positief of negatief is) en het gematchte gedeelte weggooit. Ze verbruiken geen enkel karakter – de bijpassende voor regex die ze volgen (indien aanwezig), start op dezelfde cursorpositie.

Lezen reguliere-expression.info voor meer informatie.

  • positieve lookahead:

SYNTAX:

(?=REGEX_1)REGEX_2

Match alleen als Regex_1 overeenkomt; Na het matchen van Regex_1 wordt de overeenkomst weggegooid en begint op zoek naar regex_2 op dezelfde positie.

Voorbeeld:

(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}

Regex_1 is [a-z0-9]{4}$die overeenkomt met vier alfanumerieke tekens gevolgd door het einde van de regel.
Regex_2 is [a-z]{1,2}[0-9]{2,3}die overeenkomt met een of twee letters gevolgd door twee of drie cijfers.

Regex_1 zorgt ervoor dat de draadloze lengte inderdaad 4 is, maar geen tekens verbruikt, zodat zoeken naar regex_2 op dezelfde locatie begint. Nu zorgt Regex_2 ervoor dat de string overeenkomt met een aantal andere regels. Zonder kijken zou het overeenkomen met strings van lengte drie of vijf.

  • negatieve lookahead

SYNTAX:

(?!REGEX_1)REGEX_2

Alleen overeenkomen als Regex_1 niet overeenkomt; Na het controleren van Regex_1 begint het zoeken naar regex_2 op dezelfde positie.

Voorbeeld:

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

Het vooruitziende gedeelte controleert op het FWORDin de string en mislukt als het het vindt. Als het FWORDniet vindt, slaagt de look-ahead en het volgende deel verifieert dat de lengte van de string tussen 10 en 30 is en dat het alleen woordtekens bevat a-zA-Z0-9_

Look-behind is vergelijkbaar met vooruitkijken: het kijkt alleen achter de huidige cursorpositie. Sommige regex-smaken, zoals javascript, ondersteunen geen achterliggende beweringen. En de meeste smaken die dit ondersteunen (PHP, Python, enz.) vereisen dat het achterliggende gedeelte een vaste lengte heeft.

  • Atoomgroepen negeren/vergeten in principe de volgende tokens in de groep zodra een token overeenkomt. Kijk op deze pagina voor voorbeelden van atoomgroepen

Antwoord 3

Grokking snel rondkijken.
Hoe onderscheid je vooruitkijken en achteruitkijken?
Volg een rondleiding van 2 minuten met mij:

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

Stel dat

   A  B  C #in a line

Nu vragen we B: Waar ben je?
B heeft twee oplossingen om de locatie aan te geven:

Eén, B heeft A voor en heeft C bebind
Twee, B ligt voor (vooruitkijken) van C en achter (vooruitkijk) A.

Zoals we kunnen zien, zijn de achterkant en de voorkant tegenovergesteld in de twee oplossingen.
Regex is oplossing twee.

Other episodes