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
}