regex - 如何匹配正则表达式
问题描述
我想用 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
阻塞,但我不明白为什么。
解决方案
定义正则表达式时使用双引号。这意味着\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
而是看到文字。
推荐阅读
- reactjs - 如何将密钥传递给反应组件
- hive - GreenPlum UDF 函数转换为 Hive
- bootstrap-4 - Bootstrap 链接上的圆角
- python - 创建带有描述的图像报告
- javascript - 类别选择上的 Ajax 功能
- sql - 从不同的参数返回计数
- spring - 容器环境中的 Spring Webflux cpu
- unity3d - 编辑器中的游戏 UI 已缩放(Unity,仅限 Android)
- visual-studio - 如何在 Visual Studio 2019 中显示/隐藏评论
- multithreading - 如何中断正在等待 C++ 中的 std::condition_variable_any 的线程?