我似乎无法找出正确的语法,但我想要一个 Perl 正则表达式来查找一行中有两个或更多换行符的位置,并将它们压缩为 2 个换行符。
这是我今天使用的似乎不起作用的内容:
$string =~ s/\n\n+/\n\n/g;
请让我知道我做错了什么以及我应该使用正确的 Perl 正则表达式。
在此先感谢您的帮助!
最佳答案
如果您使用的是 Perl 5.10 或更高版本,请尝试以下操作:
$string =~ s/(\R)(?:\h*\R)+/$1$1/g;
\R
是通用的行分隔符转义序列( ref )和 \h
匹配任何水平空白字符(例如空格和制表符)( ref )。因此,这会将一个或多个空行的任何序列转换为一个空行。现在的大多数应用程序在他们认为是行分隔符方面都是自由的;他们甚至会接受在同一个文档中混合使用两种或多种风格的分隔符。另一方面,一些应用程序会主动将所有行分隔符转换为一种首选样式。但有时你确实必须坚持一种特定的风格;这就是为什么我捕获了第一个
\R
匹配并用作替换,而不是随意使用\n
.请注意,这些特殊的转义序列在其他正则表达式中并未得到广泛支持。它们适用于最新版本的 PHP,以及
\R
似乎在 Ruby 2.0 中工作,但我找不到任何提到它的文档。 Ruby 1.9.2 和 2.0 支持 \h
转义序列,但它匹配一个十六进制数字( [0-9a-fA-F]
),而不是水平空白。在大多数其他口味中,\R
和 \h
将抛出异常或匹配文字 R
和 h
分别。
关于regex - Perl 正则表达式压缩多个换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4908529/