我想将字符串与Perl regexp匹配,但我的代码始终无法匹配。
Functions 0.0% (0/1)Functions and exits 0.0% (0/2)Calls 0.0% (0/6)Statement blocks 0.0% (0/24)Implicit blocks 0.0% (0/2)Decisions 0.0% (0/26)Basic conditions 0.0% (0/39)
.*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*
这似乎适用于几个正则表达式测试网站。
my $regexp = ".*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*";
if ( $myString =~ /$regexp/i ) { # $myString has the value shown above
print "Regexp OK\n";
}
else {
print "Regexp KO\n";
}
执行此代码的结果总是导致else
块,但我不明白为什么。
答案 0 :(得分:10)
定义正则表达式时,您使用的是双引号。这意味着\s
将被插值为转义序列,这会破坏您的模式。
改为使用qr//
。
my $regexp = qr/.*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*/;
如果您有use warnings
,则会收到此警告。
无法识别的转义已通过
传递
如果使用
打印已编译的正则表达式my $regexp = ".*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*";
print qr/$regexp/;
你会看到这个输出。
# no backslash here
# V
(?^:.*([A-Z][a-z]*s*[0-9]*.[0-9]*%s*([0-9]*/[0-9]*)).*)
反斜杠消失了,正则表达式引擎不知道你在谈论空格,而是看到文字s
。