Поиск…


Почему точка (.) Не соответствует символу новой строки ("\ n")?

.* в регулярном выражении в основном означает «поймать все до конца ввода».

Итак, для простых строк, таких как hello world , .* работает отлично. Но если у вас есть строка, представляющая, например, строки в файле, эти строки будут разделены разделителем строк , например \n (новая строка ) в Unix-подобных системах и \r\n (возврат каретки и новая строка) на Окна.

По умолчанию в большинстве движков регулярных выражений . не соответствует символам новой строки, поэтому совпадение останавливается в конце каждой логической строки . Если хочешь . чтобы соответствовать действительно всему, включая новые строки, вам нужно включить режим «dot- re.DOTALL -all» в выбранном вами двигателе регулярных выражений (например, добавить флаг re.DOTALL в Python или /s в PCRE.

Почему регулярное выражение пропускает некоторые закрывающие скобки / круглые скобки и сопоставляет их потом?

Рассмотрим этот пример:

Он вошел в кафе «Достоевский» и сказал: «Добрый вечер».

Здесь мы имеем два набора котировок. Предположим, мы хотим сопоставить оба, так что наше регулярное выражение совпадает с "Dostoevski" и "Good evening."

Сначала у вас может возникнуть соблазн сохранить его просто:

".*"  # matches a quote, then any characters until the next quote

Но это не работает: оно соответствует первой цитате в "Dostoevski" и до заключительной цитаты в "Good evening." , включая and said: часть. Демо-версия Regex101

Почему так случилось?

Это происходит из-за механизма регулярных выражений, когда он встречается .* , «Съедает» весь вход до самого конца. Затем он должен соответствовать финалу " . Таким образом, он« отступает »от конца матча, отбрасывая согласованный текст до тех пор, пока первый " будет найден - и это, конечно, последний " в матче , в конце "Good evening." .

Как предотвратить это и точно соответствовать первым котировкам?

Используйте [^"]* . Он не ест все входные данные - только до первого " , как это необходимо. Демо-версия Regex101



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow