我似乎记得在某些情况下$
会匹配换行符(而不是“就在之前”),但我在文档中找不到任何可以确认的内容。这在Perl的早期版本中是否适用,或者我在做梦?
答案 0 :(得分:5)
答案 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'修饰符也会以与'$'相同的方式影响'^'。