【发布时间】:2021-10-29 12:28:26
【问题描述】:
我最近在 Perl 正则表达式(OpenSuse 15.2 上的 Perl 5.26.1 x86_64)中发现了字符串结尾锚 $ 的一些意外行为。
据推测,$ 指的是 string 的结尾,而不是 grep(1) 中的 line 的结尾。因此,必须明确匹配字符串末尾的显式\n。但是,以下(完整)程序:
my @strings = (
"hello world",
"hello world\n",
"hello world\t"
);
my $i = 0;
foreach (@strings) {
$i++;
print "$i: >>$_<<\n" if /d$/;
}
产生这个输出:
1: >>hello world<<
2: >>hello world
<<
即,/d$/ 不仅匹配三个字符串中的第一个,还匹配带有尾随换行符的第二个。另一方面,正如预期的那样,正则表达式 /d\n$/ 只匹配第二个字符串,/d\s$/ 匹配第二个和第三个。
这是怎么回事?
【问题讨论】:
标签: regex perl end-of-line