Как убрать разрывы строк из текста
Вставьте текст в Text Toolkit. Если вам нужен один непрерывный блок, переключите функцию поиска и замены в режим Regex, найдите \s*\n\s* и замените его одним пробелом.
Если вы хотите сохранить разрывы абзацев, сначала используйте команду «Обрезать строки», затем найдите (?<!\n)\n(?!\n) и замените пробелом. Этот шаблон соответствует новой строке, у которой нет новой строки с обеих сторон (то есть перенос в середине абзаца) и оставляет только двойные новые строки между абзацами.
Почему текст приходит с жесткими разрывами строк
Копирование из PDF является обычным источником. В PDF нет абзацев — в нем есть текст, расположенный на странице, поэтому копия вставляет новую строку там, где заканчивается визуальная строка. Абзац, занимающий шесть строк на странице, отображается как шесть строк текста.
Другим распространенным источником является электронная почта в виде обычного текста. Старые почтовые клиенты жестко упаковывали исходящие сообщения в символы 72 или 76, а ответы в кавычках сохраняли эти разрывы на неопределенный срок.
Отличительной особенностью является то, что разрывы делаются в середине предложения, примерно в одном столбце, а не в конце предложения. Именно это делает их механически удаляемыми: настоящие разрывы абзацев разделяются строкой BLANK, а переносы в середине абзаца — нет. Все, что ниже, основано на этой разнице.
Сохранение абзацев: метод одного шаблона
Шаблон гласит: новая строка, которой не предшествует новая строка и не следует за ней. Перенос в середине абзаца соответствует; каждая новая строка в двойном разрыве имеет новую строку с одной стороны, поэтому ни одна из них не совпадает.
Если инструмент отклоняет шаблон с ошибкой, ваш браузер не поддерживает просмотр назад. В этом случае используйте более простую замену \s*\n\s*, чтобы соединить все, и повторно введите разрывы абзацев во все, куда вы вставляете текст.
- Нажмите «Обрезать линии». Это удаляет начальные и конечные пробелы из каждой строки, поэтому разделителем абзаца становятся ровно две новые строки, а не новая строка, лишний пробел и еще одна новая строка.
- Отметьте «Регулярное выражение».
- Найдите (?<!\n)\n(?!\n) и замените одним пробелом. Нажмите Заменить все.
- Проверьте счет. Оно должно примерно соответствовать количеству переносимых строк и быть меньше общего количества строк примерно на количество абзацев.
Объединение всего в один блок
Для цитаты, поискового запроса или чего-либо еще, помещающегося в одно поле, вам вообще не нужно защищать абзацы.
В режиме регулярного выражения найдите \s*\n\s* и замените его одним пробелом. \s* с обеих сторон одновременно поглощает отступы и конечные пробелы, поэтому вам не потребуется отдельная очистка двойного пробела после этого.
Окончания строк Windows и другие вещи, которые идут не так
- Если замена \n выдает ноль или оставляет после себя случайные символы, текст имеет окончания строк Windows. Найдите \r и сначала замените его ничем; который преобразует CRLF в LF, и тогда действуют приведенные выше шаблоны.
- Слова, написанные через дефис, разделяются по строкам — «меж-», затем «национальный» — после присоединения становятся «международными». Найдите «-» и ничем не замените, но сначала прочитайте количество, потому что этот шаблон также соответствует допустимым тире в прозе.
- Двойные пробелы могут сохраниться, если строка заканчивается пробелом и вы использовали шаблон просмотра назад. Найдите два пробела, замените одним и запустите его дважды.
- Текст без пустых строк между абзацами не имеет сигнала для защиты. Ни один шаблон не сможет восстановить границу абзаца, которая никогда не была закодирована, и вам придется вставлять их заново вручную.
Две вещи о режиме регулярных выражений этого инструмента
Паттерны компилируются внутри гарда. Недопустимый шаблон выдает сообщение об ошибке и оставляет текст в том виде, в каком он был: одиночная открытая скобка — это нормальное промежуточное состояние при наборе текста, и оно не должно разрушить вашу работу.
Шаблоны компилируются с глобальным флагом и без флагов multiline или dotall. Поэтому замена всегда применима везде; точка не соответствует переводу строки; и ^ и $ привязываются ко всему тексту, а не к каждой строке. Чтобы действовать построчно, явно сопоставьте новую строку, что и делают приведенные выше шаблоны.
Поля поиска и замены представляют собой однострочные входные данные. Вы можете MATCH перейти на новую строку с помощью \n, но не можете INSERT — \n, введенный в поле замены, вставляется в виде обратной косой черты, за которой следует n. Вот почему приведенный выше метод никогда не требует возврата новой строки.
Рабочий пример: два абзаца скопированы из PDF.
Вставленный текст имеет жесткий разрыв после каждой печатной строки и одну пустую строку между двумя абзацами. Используя / для новой строки, это выглядит так:
«Комитет собрался во вторник, чтобы рассмотреть / предложение, представленное в марте. Несколько членов / выразили обеспокоенность по поводу графика. / / Пересмотренная версия будет распространена до / следующего заседания».
Всего существует пять новых строк: четыре переноса и один разрыв абзаца, записанные как две последовательные новые строки. Четверо из пяти должны уйти.
- Нажмите «Обрезать линии».
- Отметьте «Регулярное выражение», найдите (?<!\n)\n(?!\n), замените пробелом, Замените все.
- Прочитайте сообщаемый подсчет.
Результат: Инструмент сообщает о заменах 3 — трех переносах в середине абзаца — и в результате получается два абзаца, каждый на одной непрерывной строке, по-прежнему разделенной пустой строкой. Использование \s*\n\s* вместо этого привело бы к сообщению 4 и объединило бы оба абзаца в один, что является правильным ответом на цитату и неправильным здесь.
Откройте инструмент
Поиск и замена литералов и регулярных выражений с историей отмены и счетчиком замен после каждого шага. Ничего из того, что вы вставляете, никуда не отправляется.
Что это не распространяется
- Это поиск и замена, а не перекомпоновка. Он не может отличить перенос в середине предложения от намеренно короткой строки, такой как адресный блок, стих или маркированный список.
- Поле замены не может вставить новую строку, поэтому любой метод, требующий возврата разрывов строк, должен завершиться где-то еще.
- Для шаблона просмотра назад требуется браузер, поддерживающий утверждения просмотра назад. Более старый браузер вместо молчания сообщает об ошибке недопустимого шаблона.
- Обработка выполняется в основном потоке, поэтому очень большой документ может ненадолго приостановить интерфейс во время преобразования.
- Отмена ограничена последними 50 операциями.
- Между посещениями ничего не сохраняется. Перезагрузка страницы автоматически отменяет вашу работу.