Если вы используете Perl 5.10 или новее, попробуйте следующее:
$string =~ s/(\R)(?:\h*\R)+/$1$1/g;
\R
- общая escape-последовательность разделителя строк ( ref ), а \h
соответствует любому горизонтальному символу пробела (например, пробел и TAB) ( ref ). Таким образом, это преобразует любую последовательность из одной или нескольких пустых строк в одну пустую строку.
Большинство приложений в наши дни либеральны в том, что они распознают как разделитель строк; они даже примут сочетание двух или более стилей разделителя в одном документе. С другой стороны, некоторые приложения активно конвертируют все разделители строк в один предпочтительный стиль. Но иногда вам нужно придерживаться одного определенного стиля; поэтому я захватил первое совпадение \R
и использовал его вместо замены, а не произвольно, используя \n
.
Имейте в виду, что эти специальные escape-последовательности широко не поддерживаются в других разновидностях регулярных выражений. Они работают в последних версиях PHP, и \R
, кажется, работает в Ruby 2.0, хотя я не могу найти ни одного документа, который упоминает об этом. Ruby 1.9.2 и 2.0 поддерживают escape-последовательность \h
, но она соответствует шестнадцатеричной цифре ([0-9a-fA-F]
), а не горизонтальному пробелу. В большинстве других вариантов \R
и \h
либо сгенерируют исключение, либо будут соответствовать литералу R
и h
соответственно.