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