Что такое кросс-платформенное регулярное выражение для удаления разрывов строк? - PullRequest
27 голосов
/ 10 июля 2010

Я уверен, что об этом уже спрашивали, но я не могу его найти.

В основном, если вы анализируете текстовый файл неизвестного происхождения и хотите заменить разрывы строк каким-либо другим разделителем, этолучшее регулярное выражение или есть другое?

(\r\n)|(\n)|(\r)

Ответы [ 5 ]

39 голосов
/ 10 июля 2010

Fletcher - об этом уже спрашивали раньше.

Вот, пожалуйста: Регулярное выражение для соответствия кросс-платформенным символам новой строки

  • Оповещение спойлера!

Регулярное выражение, которое я использую, когда хочу быть точным, это "\ r \ n? | \ N".

20 голосов
/ 10 июля 2010

Проверьте, поддерживает ли ваш движок регулярных выражений \R как класс сокращенных символов, и вам не нужно беспокоиться о различных комбинациях перевода строки / перевода строки Unicode.Если все реализовано правильно, вы можете прозрачно сопоставить все различные окончания строк ascii или Unicode, используя \R

В Unicode вам нужно обнаружить NEL (конец строки OS / 390, \ x85) LS (разделитель строк, \ x2028) и PS (разделитель абзацев, \ x2029), если вы хотитебыть полностью кроссплатформенным в эти дни.

1009 * Это спорно ли LS, NEL, и PS следует рассматривать как разрыв строки, строки окончания или белое пространство.Стандарт XML 1.0, например, не распознает NEL как символ перевода строки.ECMAScript обрабатывает LS и PS как разрывы строк, но NEL как пробелы. Perl Unicode регулярные выражения будут рассматривать VT, FF, CR, CRLF, NEL, LS и PS как разрывы строк с целью ^ и $ регулярных выражений мета-символов.

Руководство по внедрению Unicode (раздел 5.8 и таблица 5.3), вероятно, является лучшим выбором для окончательного определения того, что такое "новая строка".

Если вас интересует только ascii с классическими вариантами DOS / Windows / Unix / Mac, регулярное выражение, эквивалентное \R, равно (?>\r\n|[\r\n])

В Unicode, эквивалентно \R is (?>\r\n|\n|\x0b|\f|\r|\x85|\x2028|\x2029) В \x0b есть вертикальная вкладка;еще раз, это может соответствовать или не соответствовать вашему определению, что такое разрыв строки, но это соответствует рекомендации имплантации Unicode.(FF, или \x0C не включено в регулярное выражение, поскольку Фид новостей - это новая страница, а не новая строка в определении.)

2 голосов
/ 01 сентября 2012

Регулярное выражение для поиска любого терминатора строки Unicode должно быть (?>\x0D\x0A?|[\x0A-\x0C\x85\x{2028}\x{2029}]) скорее чем, как писал Дрюк, по крайней мере, в Perl. Взяты прямо из perl 5.10.0 документация (она была удалена в более поздних версиях). Обратите внимание на скобки после \x: U + 2029 - \x{2029} но \x2029 - это пробел ASCII (U + 0020) + цифра 2 + a цифра 9. \n вне класса символов, также не гарантируется совпадение \x{0a}.

1 голос
/ 20 апреля 2015

Если ваша платформа не поддерживает класс \R, как предложено выше @dawg, вы все равно сможете сделать довольно элегантное и надежное решение, если ваша платформа поддерживает отрицательное lookaround или вычитание класса символов(например, в Java вычитание класса осуществляется с помощью синтаксиса [x&&[^y]]).

В большинстве грамматик регулярных выражений символ точки определяется как «любой символ, кроме символа новой строки» (см.например, для JavaScript здесь ).Если вы сопоставляете что-то со следующими характеристиками:

  1. нет (любой символ, кроме символа новой строки) → символ новой строки;и
  2. - это пробел

Поскольку в настоящее время я работаю в JavaScript, у AFAIK которого нет сокращения \R сокращение или класса символов, явсе еще могу использовать отрицательный взгляд, чтобы получить то, что я хочу.Следующее регулярное выражение соответствует всем символам новой строки:

/((?!.)\s)+/g

И следующий код JavaScript, по крайней мере при запуске в Chrome 42.0.2311.90m в Windows 7, удаляет все виды строк, которые JavaScript (то есть "ECMAScript ", упомянутый в третьем абзаце @dawg), распознает:

var input = "hello\r\n\f\v\u2028\u2029 world";
var output = input.replace(/((?!.)\s)+/g, "");
document.write(output); // hello world
0 голосов
/ 10 июля 2010

Просто замените /[\r\n]+/g пустой строкой "".

Он заменит все \r и \n независимо от того, в каком порядке они появляются в строке.

...