正则表达式在 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= 前的前导空格]).
我有以下字符串:
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= 前的前导空格]).