直到几分钟前,我相信Perl的$
符合任何类型的行尾。不幸的是,我的假设结果是错误的。
以下脚本仅为$string3
删除单词 end 。
use warnings;
use strict;
my $string1 = " match to the end" . chr(13);
my $string2 = " match to the end" . chr(13) . chr(10);
my $string3 = " match to the end" . chr(10);
$string1 =~ s/ end$//;
$string2 =~ s/ end$//;
$string3 =~ s/ end$//;
print "$string1\n";
print "$string2\n";
print "$string3\n";
但是我几乎75%确定我看到过$
匹配至少chr(13).chr(10)
的情况。
那么,$
原子究竟是什么(以及在什么情况下)匹配?
答案 0 :(得分:12)
首先,它取决于/m
修饰符是否生效。
在/m
处于活动状态时,它会在\n
字符之前或字符串末尾匹配。它相当于(?=\n|\z)
。
如果没有/m
,它会在\n
字符之前匹配,如果这是字符串的最后一个字符,或者在字符串的末尾。它相当于(?=\n?\z)
。
它与通用换行符不匹配。 \R
元字符(在5.10.0中引入)执行此操作(但没有$
的字符串结尾属性)。您可以在之前的某个等效项中替换\R
\n
,以获得与通用换行符相匹配的$
类似作品。
请注意,\n
并非总是chr(10)
。这取决于平台。目前使用的大多数平台都\n
意味着chr(10)
,但情况并非总是如此。例如,在较旧的Mac上,\n
为chr(13)
而\r
为chr(10)
。
答案 1 :(得分:5)
$
仅匹配\n
/ chr(10)
之前的位置,而不是\r
/ chr(13)
之前的位置。
在newline
字符之前经常被错误解释匹配(在很多情况下它不会导致问题),但要严格匹配,在“换行”字符之前匹配,但在回车之前不匹配字符!强>
请参阅 Regex Tutorial - Start and End of String or Line Anchors 。
答案 2 :(得分:1)
/$/
/$/m
相当于
/(?=\n\z)|\z/
/(?=\n)|\z/
分别。 \n
在所有现有平台上匹配U + 000A(LINE FEED又名NEWLINE)。