Arhn - архитектура программирования

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

В прошлом я не раз задумывался о проблеме форматирования блоков текста таким образом, чтобы все промежутки пробелов «сворачивались» в один пробел, за исключением того, что абзацы должны быть сохранены — это означает, что все промежутки пустых строк сворачиваются в одиночные пустые строки, но не свернутые в пробел.

Пустая строка — это, конечно, два символа конца строки (обычно возврат каретки или перевод строки или и то, и другое) без каких-либо промежуточных символов, отличных от пробелов. (Могут быть и другие пробелы, например пробелы или табуляции).

Это, безусловно, довольно распространенная проблема, и хотя ее несложно решить, я всегда недоволен своими решениями, которые лишены элегантности или оставляют открытые лазейки. Наверняка есть элегантный выразительный способ сделать это.

Я оставляю это открытым для всех разновидностей регулярных выражений, поскольку я хотел сделать это, по крайней мере, в 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

один два три

(Также следите за пробелами в конце строк!)


Ответы:


1

сед:

sed -n 'H;$g;$s/[^\n]\n[^\n]/ /g;$s/\n\n\n*/\n\n/g;$s/  */ /g;$s/^\n//;$p' FILENAME

Перл:

perl -ne '$a.=$_;END{$_=$a;s/  */ /g;s/[^\n]\n[^\n]/ /g;s/\n\n\n*/\n\n/g;print}' FILENAME
08.02.2013
  • На данный момент я работаю в Windows и не имею доступа к sed, также я не знаю sed, поэтому не могу разобрать его самостоятельно. Я попробую Perl, хотя, если однострочный вариант подходит для Windows... 08.02.2013
  • В Windows Perl требует " вместо ', и даже с этим изменением я теряю форматирование всех абзацев (двойные пустые строки). 08.02.2013
  • Ах. В вашем примере вы изменили четверную новую строку на одну новую строку. Можете ли вы привести пример ввода и вывода, который будет более наглядным для меня? (также с форматами абзацев) Когда я тестировал, обе мои программы работали с примером, опубликованным в исходном посте. 08.02.2013
  • Обе мои программы должны превращать две или более последовательных новой строки в одну новую строку. 08.02.2013
  • Ой, извини! Я думаю, что, возможно, уценка или другая часть рендеринга Stack Exchange изменили его после того, как я понял это правильно. Позвольте мне исследовать ... Исправлено сейчас. Он должен превращать одиночные символы новой строки в пробел, а два или более последовательных новых строки — ровно в два символа новой строки. 08.02.2013

  • 2

    Я только что снова столкнулся с этой проблемой. На этот раз я использую node.js и чувствую, что нашел довольно выразительное решение:

    txt = txt.replace(/\s+/g, function (ws) {
      return /\n.*\n/.test(ws) ? '\n\n' : ' ';
    });
    
    txt = txt.replace(/(^( |\n\n)|( |\n\n)$)/g, '');
    

    Первая часть рассматривает каждый пробел в тексте и проверяет, есть ли в нем хотя бы два разрыва строки. Если это так, он сворачивается до разрыва абзаца (два последовательных разрыва строки и ничего больше). В противном случае он сворачивается в один пробел.

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

    (Единственные ограничения, которые я вижу, - это ограничения, налагаемые \s JavaScript, который не соответствует всем кодовым точкам пробелов Unicode; и, возможно, вывод разрывов строк в стиле MS, \r\n вместо \n.)

    23.04.2013
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..