在Perl中,$匹配到底是什么?

时间:2012-05-04 09:11:36

标签: regex perl

直到几分钟前,我相信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)的情况。

那么,$原子究竟是什么(以及在什么情况下)匹配?

3 个答案:

答案 0 :(得分:12)

首先,它取决于/m修饰符是否生效。

/m处于活动状态时,它会在\n字符之前或字符串末尾匹配。它相当于(?=\n|\z)

如果没有/m,它会在\n字符之前匹配,如果这是字符串的最后一个字符,或者在字符串的末尾。它相当于(?=\n?\z)

它与通用换行符不匹配。 \R元字符(在5.10.0中引入)执行此操作(但没有$的字符串结尾属性)。您可以在之前的某个等效项中替换\R \n,以获得与通用换行符相匹配的$类似作品。

请注意,\n并非总是chr(10)。这取决于平台。目前使用的大多数平台都\n意味着chr(10),但情况并非总是如此。例如,在较旧的Mac上,\nchr(13)\rchr(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)。