Regular Expressions
Regex Fallfall
Sök…
Varför matchar inte punkt (.) Det nya linjetecknet ("\ n")?
.*
i regex betyder egentligen "fånga allt tills slutet av input".
Så för enkla strängar, som hello world
, .*
fungerar perfekt. Men om du har en sträng som till exempel representerar rader i en fil, skulle dessa rader separeras av en radseparator , till exempel \n
(ny linje) på Unix-liknande system och \r\n
(vagnretur och ny linje) på Windows.
Som standard i de flesta regex motorer .
matchar inte nyradstecken, så den matchande stannar vid slutet av varje logisk linje. Om du vill .
För att matcha verkligen allt, inklusive nya linjer, måste du aktivera "dot-matches-all" -läget i din valfri regex-motor (till exempel lägg till re.DOTALL
flaggan i Python, eller /s
i PCRE.
Varför hoppar en regex över några stängande parenteser / parenteser och matchar dem efteråt?
Tänk på detta exempel:
Han gick in i caféet "Dostojevski" och sa: "God kväll."
Här har vi två citatuppsättningar. Låt oss anta att vi vill matcha båda, så att våra regex matchar på "Dostoevski"
och "Good evening."
Till att börja med kan du frestas att hålla det enkelt:
".*" # matches a quote, then any characters until the next quote
Men det fungerar inte: det matchar från det första citatet i "Dostoevski"
och fram till det avslutande citatet i "Good evening."
, inklusive den and said:
delen. Regex101-demo
Varför hände det?
Detta händer eftersom regex-motorn, när den möter .*
, "Äter upp" all ingång till slutet. Sedan måste den matcha finalen "
. Så" backar det "från slutet av matchen, släpper den matchade texten tills den första "
hittas - och det är naturligtvis den sista "
i matchen , i slutet av "Good evening."
del.
Hur kan man förhindra detta och matcha exakt de första citaten?
Använd [^"]*
. Den äter inte hela ingången - bara förrän den första "
, precis efter behov. Regex101-demo