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



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow