如果包含换行符,则RegEx匹配,但不匹配

时间:2014-11-18 16:43:31

标签: regex perl

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或其他比较/替代。

2 个答案:

答案 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字符匹配。