Regex 我可以确定or语句中的哪个正则表达式与我的字符串匹配吗?
对于本声明:Regex 我可以确定or语句中的哪个正则表达式与我的字符串匹配吗?,regex,perl,Regex,Perl,对于本声明: if ($SDescription =~ m/$sdescription_1/gi or $SDescription =~ m/$sdescription_2/gi){ #... } 除了打印$SDescription以手动对其进行比较外,是否可以判断哪些$SDescription匹配:$SDescription\u 1或$SDescription\u 2 在标量上下文中,=~运算符返回匹配数。如果没有/g修饰符,匹配的数量是0或1,因此您可以执行以下操作 $match_val
if ($SDescription =~ m/$sdescription_1/gi or $SDescription =~ m/$sdescription_2/gi){
#...
}
除了打印
$SDescription
以手动对其进行比较外,是否可以判断哪些$SDescription
匹配:$SDescription\u 1
或$SDescription\u 2
在标量上下文中,=~
运算符返回匹配数。如果没有/g
修饰符,匹配的数量是0或1,因此您可以执行以下操作
$match_val = ($SDescription =~ m/$sdescription_1/i)
+ 2 * ($SDescription =~ m/$sdescription_2/i);
if ($match_val) {
if ($match_val == 1) { ... } # matched first regex
if ($match_val == 2) { ... } # matched second regex
if ($match_val == 3) { ... } # matched both regex
}
您可以使用不匹配的组(?:)来完成此操作。对于您的代码,我将尝试以下内容:
if ($SDescription =~ m/((?:$sdescription_1))|((?:$sdescription_2))/gi) {
# $1 will hold a value IFF $sdescription_1 matches
# $2 will hold a value IFF $sdescription_2 matches
}
哪一个匹配的“字符串”或模式应该显示在$1或$2中。见下面的测试程序:
测试程序:
$str1 = "TEST1";
$str2 = "TEST2";
#Match results on $str1 (group 1)
$str1 =~ /((?:TEST1))|((?:TEST2))/;
print "[$1] [$2]\n";
#Match results on $str2 (group 2)
$str2 =~ /((?:TEST1))|((?:TEST2))/;
print "[$1] [$2]\n";
返回结果:
[TEST1] []
[] [TEST2]
你不想写这样的东西有什么原因吗?(除非您在以后的匹配中使用
\g
锚定,否则/g
修饰符是superflous:模式匹配或不匹配。)
这里不需要非捕获组。将它们放在()中是多余的。代码可以工作,但不需要将(?:)带入图片中。-我相信如果正则表达式比TEST1非匹配组稍微复杂一点可能会有用。。。没有?也许吧,但他们与这个问题或你的解决方案毫无关系。它们是不必要的,会混淆问题。((?:x))精确地等价于(x),即使x是一个复杂的表达式。
if ($SDescription =~ /$sdescription_1/i) {
# Do stuff for first pattern
}
elsif ($SDescription =~ /$sdescription_2/i) {
# Do stuff for second pattern
}