正则表达式在 Perl 中不匹配,而在其他程序中匹配

Regex does not match in Perl, while it does in other programs

我有以下字符串:

load Add 20 percent
 to accommodate

我想去:

load Add 20 percent to accommodate

例如,使用 sublime 中的正则表达式,可以通过以下方式轻松完成: 正则表达式: ([a-z])\n\s([a-z]) 代替:

但是,在 Perl 中,如果我输入此命令,(用于测试我是否可以在任何情况下匹配模式):

perl -pi.orig -e 's/[a-z]\n.+to/TEST/g' file

不匹配。

有谁知道为什么 Perl 在这种情况下会有所不同,Perl 命令的正确表述应该是什么?

默认情况下,Perl -p 标记一行一行地读取输入行。因此,您不能期望您的正则表达式匹配 \n.

之后的任何内容

相反,您想一次读取整个输入。您可以使用标志 -0777 来执行此操作(这在 perlrun 中有记录):

perl -0777 -pi.orig -e 's/([a-z])\n\s(to)/ /' file

只是想提供帮助并在下面提醒您对 perl 正则表达式的初步建议:

perl -pi.orig -e 's/[a-z]\n.+to/TEST/g' file

请注意,在 perl 正则表达式中,[a-z] 将仅匹配一个字符,不包括任何空格。然后作为开始,请包括一个重复说明符并包括 'eat' 空格的能力。还要在替换中保留已识别的(但 'eaten')'to',您必须将其再次放入替换字符串中,就像下面示例 perl 程序中的最后一样:

$str = "load Add 20 percent
 to accommodate";

print "before:\n$str\n";

$str =~ s/([ a-z]+)\n\s*to/ to/;

print "after:\n$str\n";

此程序产生以下输入:

before:
load Add 20 percent
 to accommodate
after:
load Add 20 percent to accommodate

那么如果我很清楚你想做什么,你的正则表达式应该看起来像:

s/([ a-z]+)\n\s*to/\1 to/ (请注意 [=29= 前的前导空格]).