我可以确定任一个或语句中的哪个正则表达式匹配我的字符串吗?

时间:2014-02-14 23:58:45

标签: regex perl

对于本声明:

if ($SDescription =~ m/$sdescription_1/gi or $SDescription =~ m/$sdescription_2/gi){
#...
}

除了打印$SDescription以手动比较之外,是否可以判断哪个$SDescription匹配:$sdescription_1$sdescription_2

3 个答案:

答案 0 :(得分:7)

在标量上下文中,=~运算符返回匹配数。如果没有/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

}

答案 1 :(得分:3)

你有什么理由不想写这样的东西吗? (/g修饰符是超级的,除非您在以后的匹配中使用\G锚点:模式匹配或不匹配。)

if ($SDescription =~ /$sdescription_1/i) {
  # Do stuff for first pattern
}
elsif ($SDescription =~ /$sdescription_2/i) {
  # Do stuff for second pattern
}

答案 2 :(得分:0)

您可以使用非匹配组(?:)来完成此操作。对于你的代码,我会尝试这样的事情:

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]