Regular Expressions
Regex Pułapki
Szukaj…
Dlaczego kropka (.) Nie pasuje do znaku nowej linii („\ n”)?
.*
w wyrażeniu regularnym oznacza „złap wszystko do końca wejścia”.
Tak więc w przypadku prostych ciągów, takich jak hello world
, .*
działa idealnie. Ale jeśli masz ciąg reprezentujący na przykład linie w pliku, linie te zostaną oddzielone separatorem linii , takim jak \n
(nowa linia) w systemach uniksopodobnych i \r\n
(powrót karetki i nowa linia) w Windows
Domyślnie w większości silników regex .
nie pasuje do znaków nowej linii, więc dopasowanie kończy się na końcu każdej linii logicznej . Jeśli chcesz .
aby dopasować naprawdę wszystko, w tym nowe wiersze, musisz włączyć tryb „kropki dopasowuje wszystko” w wybranym silniku re.DOTALL
regularnych (na przykład, dodaj flagę re.DOTALL
w Pythonie lub /s
w PCRE.
Dlaczego wyrażenie regularne pomija nawiasy zamykające / nawiasy i dopasowuje je później?
Rozważ ten przykład:
Poszedł do kawiarni „Dostojewski” i powiedział: „Dobry wieczór”.
Tutaj mamy dwa zestawy cytatów. Załóżmy, że chcemy dopasować oba, aby nasze wyrażenia regularne pasowały do "Dostoevski"
i "Good evening."
Na początku możesz pokusić się o uproszczenie:
".*" # matches a quote, then any characters until the next quote
Ale to nie działa: pasuje od pierwszego cytatu w "Dostoevski"
i do końcowego w "Good evening."
, w tym and said:
część. Demo Regex101
Dlaczego to się stało?
Dzieje się tak, ponieważ silnik wyrażeń regularnych, gdy go napotka .*
, „Zjada” wszystkie dane wejściowe do samego końca. Następnie musi pasować do końcowego "
. Tak więc„ wycofuje się ”od końca meczu, puszczając pasujący tekst, dopóki nie zostanie znalezione pierwsze "
- i oczywiście jest to ostatnie "
w meczu , na końcu części "Good evening."
.
Jak temu zapobiec i dopasować dokładnie do pierwszych cytatów?
Użyj [^"]*
. Nie zjada wszystkich danych wejściowych - tylko do pierwszego "
, w razie potrzeby. Demo Regex101