Regular Expressions
Regex-valkuilen
Zoeken…
Waarom komt een punt (.) Niet overeen met het newline-teken ("\ n")?
.*
in regex betekent in feite " alles vangen tot het einde van de invoer".
Dus, voor eenvoudige strings, zoals hello world
, .*
werkt perfect. Maar als u een tekenreeks hebt die bijvoorbeeld lijnen in een bestand vertegenwoordigt, worden deze lijnen gescheiden door een lijnscheidingsteken , zoals \n
(newline) op Unix-achtige systemen en \r\n
(regelterugloop en newline) op Ramen.
Standaard zijn in de meeste regex-engines .
komt niet overeen met tekens van een nieuwe regel, dus het matchen stopt aan het einde van elke logische regel . Als je wilt .
om echt alles te matchen, inclusief nieuwe regels, moet je de modus "dot-matches-all" inschakelen in de regex-engine van je keuze (voeg bijvoorbeeld de re.DOTALL
vlag toe in Python of /s
in PCRE.
Waarom slaat een regex enkele afsluitende haakjes / haakjes over en koppelt ze deze daarna?
Beschouw dit voorbeeld:
Hij ging het café "Dostoevski" in en zei: "Goedenavond."
Hier hebben we twee sets citaten. Laten we aannemen dat we beide willen matchen, zodat onze regex overeenkomt met "Dostoevski"
en "Good evening."
In het begin zou je in de verleiding kunnen komen om het simpel te houden:
".*" # matches a quote, then any characters until the next quote
Maar het werkt niet: het komt overeen met het eerste citaat in "Dostoevski"
en tot het slotcitaat in "Good evening."
, inclusief het and said:
deel. Regex101 demo
Waarom gebeurde het?
Dit gebeurt omdat de regex-engine, wanneer deze .*
Tegenkomt, alle invoer tot het einde "opeet". Vervolgens moet het overeenkomen met de finale "
. Dus" het gaat achteruit "vanaf het einde van de wedstrijd, waarbij de overeenkomende tekst wordt losgelaten totdat de eerste "
wordt gevonden - en het is natuurlijk de laatste "
in de wedstrijd , aan het einde van het gedeelte "Good evening."
.
Hoe dit te voorkomen en exact te matchen met de eerste quotes?
Gebruik [^"]*
. Het eet niet alle invoer - alleen tot de eerste "
, net als nodig. Regex101 demo