如何匹配正则表达式

Jér*_*e G 1 regex scripting perl

我想匹配一个字符串与Perl正则表达式,但我的代码总是无法匹配.

数据

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)
Run Code Online (Sandbox Code Playgroud)

正则表达式

.*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*
Run Code Online (Sandbox Code Playgroud)

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

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";
}
Run Code Online (Sandbox Code Playgroud)

执行此代码的结果总是导致else阻塞,但我不明白为什么.

sim*_*que 10

在定义正则表达式时,您使用的是双引号.这意味着\s将被插值为转义序列,这会破坏您的模式.

qr//改用.

my $regexp = qr/.*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*/;
Run Code Online (Sandbox Code Playgroud)

如果你有use warnings,你会得到这个警告.

无法识别的逃脱通过

如果您打印已编译的正则表达式

my $regexp = ".*([A-Z][a-z]*\s*[0-9]*\.[0-9]*%\s*\([0-9]*\/[0-9]*\)).*";
print qr/$regexp/;
Run Code Online (Sandbox Code Playgroud)

你会看到这个输出.

#                no backslash here
#                 V
(?^:.*([A-Z][a-z]*s*[0-9]*.[0-9]*%s*([0-9]*/[0-9]*)).*)
Run Code Online (Sandbox Code Playgroud)

随着反斜杠消失,正则表达式引擎不知道你在谈论空格,s而是看到一个文字.