Для полноты я хочу сослаться здесь на большой пост Удалить / удалить пустые и пустые строки на форумах пользователей UltraEdit, в котором после всех объяснений для новичков содержится решение по сокращению двух или более строк.с пустыми строками (пустыми строками) или пустыми строками (пустыми строками) в одну пустую строку независимо от типа ограничителя строкиПоддержка выражений не ограничена его линейной архитектурой.Механизмы регулярных выражений Perl имеют флаг, который определяет, соответствует ли точка всем символам, кроме символов новой строки, таким как возврат каретки (CR) и перевод строки (LF), или действительно всем символам, включая CR и LF.Это имеет значение, если текстовый файл интерпретируется как большой поток байтов или как последовательность строк для регулярного выражения Perl находит / заменяет.В UltraEdit флаг установлен по умолчанию, чтобы не включать \r
(CR) и \n
(LF) через точку в строке поиска регулярного выражения.Но это поведение можно легко изменить в UltraEdit, запустив строку регулярного выражения с (?s)
, которая изменяет значение флага match_not_dot_newline
, как указано на форумах пользователей UltraEdit в теме "."в Perl регулярные выражения не включают CRLF?
Регулярное выражение Perl заменяет работу для файлов с
- возврат каретки + перевод строки (DOS / Windows) или
- только перевод строки (Unix, Mac OS 10.0 и более поздние версии) или
- только возврат каретки (Mac OS 9 и предыдущие версии)
как окончание строки с опциональными конечными пробелами и табуляцией в конце абзаца (одна или несколько строк) и с двумя или более строками без (пустая строка) или с пробелами (пустая строка) под абзацем можно выполнить с помощью строки поиска \h*(\r?\n|\r)(?:\h*\1){2,}
и \1\1
в качестве замещающей строки.
Объяснение:
\h*
соответствует любой горизонтальный пробел символ в соответствии с Unicode 0 илибольше раз .Эта первая часть поискового выражения соответствует горизонтальным пробельным символам в конце строки, таким как горизонтальные табуляции, обычные пробелы, пробелы без пробелов и некоторые другие не часто используемые пробелы.
Использование \s
не годится, так как этот класс символов соответствует любому символу пробела, включая символы возврата вертикального пробела и перевода строки.
(\r?\n|\r)
... - это ИЛИ выражение с двумя аргументами в маркирующей группе .Первый аргумент сопоставляет перевод строки при желании с предыдущим возвратом каретки, а второй аргумент - только с возвратом каретки.Таким образом, это выражение соответствует всем трем общим типам окончаний строк полностью корректно.Важно, чтобы остаток поиска и замены всегда соответствовал либо CR + LF (оба вместе) или просто LF или просто CR .
(?:\h*\1)
... является группой без маркировки , которая соответствует 0 или более горизонтальным пробелам и символ новой строки , найденный ранее с обратной ссылкой \1
, то есть CR + LF или просто LF или просто CR .Таким образом, эта часть выражения находит пустую или пустую строку.
{2,}
... - это множитель для предыдущего выражения в группе без маркировки, что означает как минимум два раза .Поэтому после конца абзаца должно быть две или более пустых или пустых строки.Только одной пустой или пустой строки под абзацем недостаточно для положительного соответствия поискового выражения.
Заменяющая строка \1\1
дважды ссылается на первый найденный разрыв строки.
Преимущество этого регулярного выражения по сравнению с другими, опубликованными здесь, заключается в том, что тип окончания строки не должен быть известен.Выражение поиска обнаруживает, что найденная и найденная строка заканчивается ссылкой в строке замены.И, вероятно, существующие пробельные пробелы в конце абзаца и пробелы в следующей строке удаляются также с помощью этого регулярного выражения замены, если под абзацем есть две или более пустых или пустых строк.
{2,}
можно заменить на+
в строке поиска, если обрезка пробелов в конце абзаца и в следующей пустой или пустой строке также должна выполняться при выполнении этого регулярного выражения Perl replace.Но обратите внимание, что в этом случае замена выполняет замены, которые вообще ничего не меняют, если в конце абзаца нет завершающих пробелов, а следующая строка - пустая строка.