12

直到几分钟前,我还相信Perl可以匹配任何类型的$行尾。不幸的是,我的假设被证明是错误的。

以下脚本仅删除单词end$string3

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)

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

4

3 回答 3

12

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

使用/mactive 时,它​​匹配\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).

于 2012-05-04T09:32:32.270 回答
5

$仅匹配 / 之前的位置,而不匹配\n/之前的位置。chr(10)\rchr(13)

它经常被误解为在newline字符之前匹配(在很多情况下它不会导致问题),但严格来说,它在“换行”字符之前匹配,而不是在回车字符之前匹配!

请参阅正则表达式教程 - 字符串或线锚的开始和结束

于 2012-05-04T09:30:51.367 回答
1
/$/
/$/m

相当于

/(?=\n\z)|\z/
/(?=\n)|\z/

分别。\n在所有现有平台上匹配 U+000A(LINE FEED aka NEWLINE)。

于 2012-05-04T16:36:21.573 回答