首页 > 解决方案 > 如何匹配正则表达式

问题描述

我想用 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)

正则表达式

.*([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阻塞,但我不明白为什么。

标签: regexperlscripting

解决方案


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

改为使用qr//

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

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

无法识别的转义 \s 通过

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

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而是看到文字。


推荐阅读