regex - Perl 正则表达式压缩多个换行符

标签 regex perl

我似乎无法找出正确的语法,但我想要一个 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将抛出异常或匹配文字 Rh分别。

关于regex - Perl 正则表达式压缩多个换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4908529/

相关文章:

perl `require` 对于变量给出的文件

perl - 超时 perl 中的用户输入

perl - 在 Perl 脚本中使用 File::Find 时忽略整个目录

c# 正则表达式将 <br/> 或 [br/] 替换为 [pre=html]code[br/]code[/pre] 之间的 "\n"

regex - 验证Powershell中输入的文件名

java - 来自/etc/passwd 和/etc/group 的行的正则表达式

perl - "use warnings;"和 "use warnings ' all';"之间有区别吗?

javascript - 如何从单个正则表达式获取多个匹配项

ruby - 正则表达式不匹配带括号的新行

xml - Perl XML::Parser - 如何访问一个简单的解析树?