如何匹配正则表达式

时间:2018-04-25 12:48:02

标签: regex perl scripting

我想将字符串与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]*\)).*

这似乎适用于几个正则表达式测试网站。

Perl代码

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块,但我不明白为什么。

1 个答案:

答案 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