perl中的奇怪行为。 给定正则表达式($ reg)匹配"开始"然后" 1"或" 2"然后"结束"也匹配" 1 \ n" - 为什么?
my $reg='^[1-2]$';
my $x="1\n";
if ($x =~ m/$reg/) {
print "matches";
} else {
print "doesn't match";
}
如果我在$ x中执行两个换行符,则不再匹配。 我正在寻找一个与上述相符的代码。它应该是真的,当" 1"或" 2"是$ x。只允许RegEx - 没有chomp或其他比较/替代。
答案 0 :(得分:5)
$
匹配可选的换行符。
http://perldoc.perl.org/perlre.html
$ Match the end of the string (or before newline at the end
of the string)
但它不会匹配双线换行。
你可能想要:
my $reg='\A[1-2]\z';
将会:
\A Match only at beginning of string
\Z Match only at end of string, or before newline at the end
\z Match only at end of string
编辑:正如mpapec的评论中提到的那样:
鉴于你有一个静态模式,你可能会多次匹配 - 你正在做不必要的工作,因为解释器每次检查它时都会编译你的正则表达式。
您可以使用qr
编译静态模式,从而保存此处理。
http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators
my $reg = qr/\A[12]\z/;
if ( $x =~ $reg ) {
#...
}
如果您经常测试相同的模式(特别是如果它是一个复杂的模式),这尤其适用。
答案 1 :(得分:0)
^[1-2]$'
匹配1\n
,因为$
(行锚的结尾)与\n
字符匹配。