При написании этого ответа мне приходилось сопоставлять исключительно s
разрывы строк вместо использования -flag ( dotall
- точка соответствует разрывам строк ).
Сайты, обычно используемые для проверки регулярных выражений, ведут себя по-разному при попытке сопоставления с \n
или \r\n
.
я отметил
Regex101 сопоставляет только разрывы строк
\n
( пример - удалить,\r
и это соответствует)RegExr соответствует переносы строк ни на ,
\n
ни на ,\r\n
и я не могу найти что - то , чтобы сделать его соответствовать разрыв строки, за исключением тойm
-flag и\s
( например )Debuggex ведет себя еще более по-разному:
в этом примере он совпадает только с\r\n
, в то время как
здесь он только с\n
, с теми же флагами и указанным движком
Я полностью осведомлен о m
флаге (многострочный - ^
сопоставляет начало и $
конец строки), но иногда это не вариант. То же самое с тем \s
, что он также соответствует символам табуляции и пробелов.
Моя мысль использовать символ новой строки ( \u0085
) в Юникоде не удалась, поэтому:
- Есть ли надежный способ интегрировать совпадение на разрыв строки (желательно независимо от используемого языка) в регулярное выражение?
- Почему вышеупомянутые сайты ведут себя по-разному (особенно Debuggex, сопоставляя только
\n
один раз и только один раз\r\n
)?
источник
[\r\n]+
- или что-то вроде этого\r?\n
чтобы соответствовать обе последовательности\r\n
и\n
последовательности завершения строки. Это не работает для старого\r
синтаксиса Mac, но этот довольно редкий в наши дни.Ответы:
Собираюсь ответить в обратном направлении.
2) Для полного объяснения
\r
и\n
я должен обратиться к этому вопросу, который является гораздо более полным, чем я опубликую здесь: Разница между \ n и \ r?Короче говоря, Linux использует
\n
для новой линейки, Windows\r\n
и старых Mac\r
. Так что есть несколько способов написать новую строку. Ваш второй инструмент (RegExr), например, соответствует на сингле\r
.1)
[\r\n]+
как предположил Илья, будет работать, но также будет соответствовать нескольким последовательным новым строкам.(\r\n|\r|\n)
правильнееисточник
\r
/\n
зависят от операционной системы - это вещь, которую можно знать (;)) - но почему два примера отладки совпадают один раз на \ r \ n и один раз на \ n? По крайней мере, нет никакой разницы (в примерах), видимой для меня.\r\n
текст (если вы щелкните правой кнопкой мыши и покажете источник, вы найдете{{Infobox XC Championships\r\n|Name =
где-нибудь). Второй инструмент написан на Flash, и когда вы читаете страницу с информацией о программе, она содержит ошибки в символах перевода строки.(\r\n|\r|\n)
можно записать проще\r\n?
\n
У вас есть разные окончания строк в текстах примеров в Debuggex. Что особенно интересно, Debuggex, похоже, определил, какой стиль окончания строки вы использовали первым, и он преобразует все дополнительные окончания строки, введенные в этот стиль.
Я использовал Notepad ++ для вставки образца текста в формате Unix и Windows в Debuggex, и что бы я ни вставил первым, это то, с чем застрял этот сеанс Debuggex.
Итак, вы должны вымыть свой текст через текстовый редактор, прежде чем вставлять его в Debuggex. Убедитесь, что вы вставляете стиль, который вы хотите. По умолчанию в Debuggex используется стиль Unix (\ n).
Кроме того, NEL (\ u0085) - это нечто совершенно иное: https://en.wikipedia.org/wiki/Newline#Unicode
(\r?\n)
будет охватывать Unix и Windows. Вам нужно что-то более сложное, например(\r\n|\r|\n)
, если вы хотите соответствовать старому Mac тоже.источник
В PCRE
\R
соответствует\n
,\r
и\r\n
.источник
(\r\n|\r|\n)
Это относится только к вопросу 1.
У меня есть приложение, которое работает в Windows и использует многострочный редактор MFC.
В окне редактора ожидаются разрывы строк CRLF, но мне нужно проанализировать введенный текст
с некоторыми действительно большими / неприятными регулярными выражениями '.
Я не хотел подчеркивать это во время написания регулярного выражения, поэтому
я закончил нормализацию между анализатором и редактором, так что
регулярные выражения просто используют
\n
. Я также отлавливаю операции вставки и конвертирую их для блоков.Это не займет много времени.
Это то, что я использую.
источник
В Python:
или более строгий:
источник