$ per有时会匹配Perl中的换行符吗?

时间:2010-08-12 14:57:44

标签: regex perl

我似乎记得在某些情况下$会匹配换行符(而不是“就在之前”),但我在文档中找不到任何可以确认的内容。这在Perl的早期版本中是否适用,或者我在做梦?

4 个答案:

答案 0 :(得分:5)

情况一直如此。请参阅perldoc perlreref$是一个锚点):

  

$匹配字符串结尾(或行,如果使用/m)或在换行符之前

如果要匹配字符串的结尾,则应使用\z

  

\z匹配绝对字符串结尾

答案 1 :(得分:3)

如果您将/s修饰符传递给正则表达式,则$会匹配字符串的结尾,并允许.\n匹配。

这可能有点令人困惑。对于foo\n字符串,请注意以下之间的区别:

/.$/ # matches 'o'

/.$/s # still matches 'o'

/.+$/s # matches 'foo\n'

/.\z/ # doesn't match at all

/.\z/s # matches '\n'

答案 2 :(得分:3)

你混淆了两件非常相似的事情。如果未使用$/m匹配 字符串末尾,位于字符串末尾或结尾处如果使用/m,则除了最终换行符之外的字符串。但是,它实际上并不匹配(使用)换行符本身。您仍然可以将换行符本身与正则表达式中的其他内容匹配,例如\n;或者,如果你也使用/s,那么/blah$./sm理论上会匹配“blah \ n”,即使$不是正则表达式中的最后一个。

(这实际上不起作用的原因是$.$\实际上都被解释为特殊变量,而不是$.,所以它是实际上很难在正则表达式$之后放一些东西。令人困惑,不是吗?)

答案 3 :(得分:1)

添加'm'修饰符,'$'将匹配(但不消耗)字符的结尾。通常'$'匹配 string 的结尾。

my $sample = "first\nsecond\nthird";
$sample =~ s/$/END/mg;
print $sample;

产地:

firstEND
secondEND
thirdEND

如果你想消费换行符,只需使用\ n转义字符:

my $sample = "first\nsecond\nthird";
$sample =~ s/\n/END/g;
print $sample;

现在你得到:

firstENDsecondENDthird

请注意,'m'修饰符也会以与'$'相同的方式影响'^'。