Vraag wat is het verschil tussen ?:, ?! en? = in regex?


Ik zocht naar de betekenis van deze uitdrukkingen, maar kon het exacte verschil tussen beide niet begrijpen. Dit is wat ze zeggen:

  • ?: Overeenkomen met expressie maar niet vastleggen.
  • ?= Pas een achtervoegsel aan, maar sluit het uit.
  • ?! Overeenkomen als achtervoegsel afwezig is.

Ik probeerde deze in eenvoudige RegEx te gebruiken en kreeg vergelijkbare resultaten voor iedereen. voorbeeld: de volgende 3 uitdrukkingen geven zeer vergelijkbare resultaten.

  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*

62
2018-05-29 18:33


oorsprong


antwoorden:


Het verschil tussen ?= en ?! is dat de eerstgenoemde vereist dat de gegeven uitdrukking overeenkomt en de laatste vereist dit niet bij elkaar passen. Bijvoorbeeld a(?=b) komt overeen met "a" in "ab", maar niet met "a" in "ac". Terwijl a(?!b) komt overeen met de "a" in "ac", maar niet met de "a" in "ab".

Het verschil tussen ?: en ?= is dat ?= sluit de expressie uit tijdens de hele wedstrijd ?: maakt gewoon geen capturing-groep aan. Dus bijvoorbeeld a(?:b) zal de "ab" in "abc" evenaren a(?=b) komt alleen overeen met de "a" in "abc". a(b) zou overeenkomen met de "ab" in "abc" en maak een opname met de "b".


74
2018-05-29 18:43



?:  is for non capturing group
?=  is for positive look ahead
?!  is for negative look ahead
?<= is for positive look behind
?<! is for negative look behind

Controleer alstublieft hier: http://www.regular-expressions.info/lookaround.html voor een zeer goede tutorial en voorbeelden over lookahead in reguliere expressies.


52
2018-05-29 18:38



Om beter te begrijpen, laten we de drie uitdrukkingen plus een capturing-groep toepassen en elk gedrag analyseren.

  • ()  groep vastleggen - de regex binnen de haakjes moet worden gematcht en de match maakt een capturing-groep
  • (?:)  niet-vastleggende groep - de regex binnen de haakjes moet worden gekoppeld, maar maakt niet de capturing-groep
  • (?=)  positieve blik vooruit - stelt dat de regex moet worden vergeleken
  • (?!)  negatieve blik vooruit - stelt dat het onmogelijk is om de regex te matchen

Laten we van toepassing zijn q(u)i naar ophouden. q wedstrijden q en de capturing-groep u wedstrijden u. De wedstrijd binnen de vastleggende groep wordt gemaakt en een vastleggende groep wordt gemaakt. Dus de motor gaat verder met i. En i zal matchen ik. Deze laatste poging is geslaagd. qui is gekoppeld en een capturing-groep met u is gecreëerd.

Laten we van toepassing zijn q(?:u)i naar ophouden. Nog een keer, q wedstrijden q en de niet-vastleggende groep u wedstrijden u. De overeenkomst van de niet-vastleggende groep wordt gebruikt, maar de vastleggende groep is niet gemaakt. Dus de motor gaat verder met i. En i zal matchen ik. Deze laatste poging is geslaagd. qui is gekoppeld

Laten we van toepassing zijn q(?=u)i naar ophouden. De lookahead is positief en wordt gevolgd door een ander token. Nog een keer, q wedstrijden q en u wedstrijden u. Nogmaals, de wedstrijd van de lookahead moet worden weggegooid, dus de motor stapt terug i in de string naar u. De lookahead was succesvol, dus de motor gaat verder met i. Maar i kan niet matchen u. Dus deze matchpoging mislukt.

Laten we van toepassing zijn q(?=u)u naar ophouden. De lookahead is positief en wordt gevolgd door een ander token. Nog een keer, q wedstrijden q en u wedstrijden u. De wedstrijd van de lookahead moet worden weggegooid, dus de motor komt terug u in de string naar u. De lookahead was succesvol, dus de motor gaat verder met u. En u zal matchen u. Dus deze matchpoging is succesvol. Qu is gekoppeld

Laten we van toepassing zijn q(?!i)u naar ophouden. Zelfs in dit geval is lookahead positief (omdat ikomt niet overeen) en wordt gevolgd door een ander token. Nog een keer, q wedstrijden q en i komt niet overeen u. De wedstrijd van de lookahead moet worden weggegooid, dus de motor komt terug u in de string naar u. De lookahead was succesvol, dus de motor gaat verder met u. En u zal matchen u. Dus deze matchpoging is succesvol. Qu is gekoppeld

Dus, ten slotte, het echte verschil tussen lookahead en niet-capturing-groepen, het gaat er allemaal om of je het bestaan ​​of de test wilt testen en de match wilt opslaan. Capturing-groep is duur dus gebruik het verstandig.


8
2017-08-15 22:20



Probeer matching foobar tegen deze:

/foo(?=b)(.*)/
/foo(?!b)(.*)/

De eerste regex komt overeen en retourneert "balk" als eerste submatch - (?=b) komt overeen met de 'b', maar verbruikt deze niet, maar laat deze over aan de volgende haakjes.

De tweede regex komt NIET overeen, omdat verwacht wordt dat "foo" wordt gevolgd door iets anders dan 'b'.

(?:...) heeft precies hetzelfde effect als eenvoudig (...), maar het geeft dat gedeelte niet als een submatch.


5
2018-05-29 18:42