Perl Regex OR条件

时间:2013-08-30 19:32:37

标签: regex perl

我有一个变量,如$ var = 1.2.3或$ var = Variable / 1.2.3。我正在尝试编写一个匹配并存储在1美元的正则表达式。代码如下:

 if ($var =~ m/[\w+\/\d+.\d+.\d+])/){
     $a = $1;
 }

如果任何$ var占优势,我想在上述条件下匹配。请建议我。谢谢。

3 个答案:

答案 0 :(得分:2)

Parentheses capture。它依赖$1容易出错,只需使用m atch运算符的返回值。

for my $var ('1.2.3', 'Variable/1.2.3') {
    if (my ($version) = $var =~ m{
        (?:\A | /)            # beginning of string or a slash
        (\d+ [.] \d+ [.] \d+) # capture version number triple
        \z                    # end of string
    }msx) {
        print ">>> $version <<<\n";
    }
}
__END__
>>> 1.2.3 <<<
>>> 1.2.3 <<<

答案 1 :(得分:1)

您应该删除该字符类。字符类只匹配一个字符。它不代表任何序列。此外,.是正则表达式中的元字符。要按字面意思匹配,你需要逃避它。

然后,您需要使用/量词将?之前的部分设为可选部分,因为它不一定存在于字符串中:

if ($var =~ m/((?:\w+\/)?\d+\.\d+\.\d+)/){
    $a = $1;
}

仅供参考,您可以对匹配运算符使用任何分隔符,以避免转义/

m!((?:\w+/)?\d+\.\d+\.\d+)!

答案 2 :(得分:-1)

试试这个:

if ($var =~ m/(?>[a-z_][a-z0-9_]*+\/)?+[0-9]++\.[0-9]++\.[0-9]++/i) {
     $a = $&;
 }