В прошлом я не раз задумывался о проблеме форматирования блоков текста таким образом, чтобы все промежутки пробелов «сворачивались» в один пробел, за исключением того, что абзацы должны быть сохранены — это означает, что все промежутки пустых строк сворачиваются в одиночные пустые строки, но не свернутые в пробел.
Пустая строка — это, конечно, два символа конца строки (обычно возврат каретки или перевод строки или и то, и другое) без каких-либо промежуточных символов, отличных от пробелов. (Могут быть и другие пробелы, например пробелы или табуляции).
Это, безусловно, довольно распространенная проблема, и хотя ее несложно решить, я всегда недоволен своими решениями, которые лишены элегантности или оставляют открытые лазейки. Наверняка есть элегантный выразительный способ сделать это.
Я оставляю это открытым для всех разновидностей регулярных выражений, поскольку я хотел сделать это, по крайней мере, в Perl, Vim и JavaScript. Вот моя последняя ленивая попытка сделать это в node.js, лазейка, очевидно, волшебное слово. Вероятно, это довольно типично для неудовлетворительных решений, которые я использовал::
text = text.replace(/\r?\n(?:\s*\r?\n)+/g, '_SomeMagicWord_');
text = text.replace(/\s\s+/gm, ' ');
text = text.replace(/_SomeMagicWord_/g, '\r\n\r\n');
Если мое объяснение неясно, оно должно преобразоваться из этого:
foo bar baz
fred barney wilma
один два три
к этому:
foo bar baz fred barney wilma
один два три
(Также следите за пробелами в конце строк!)
"
вместо'
, и даже с этим изменением я теряю форматирование всех абзацев (двойные пустые строки). 08.02.2013