-1

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

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

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

4

3 回答 3

2

括号捕获。依赖 很容易出错$1,只需使用match 运算符的返回值即可。

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 <<<
于 2013-08-30T19:36:12.943 回答
1

您应该删除该字符类。一个字符类只匹配一个字符。它不代表任何序列。此外,.是正则表达式中的元字符。要从字面上匹配它,您需要对其进行转义。

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

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

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

m!((?:\w+/)?\d+\.\d+\.\d+)!
于 2013-08-30T19:34:22.747 回答
-1

尝试这个:

if ($var =~ m/(?>[a-z_][a-z0-9_]*+\/)?+[0-9]++\.[0-9]++\.[0-9]++/i) {
     $a = $&;
 }
于 2013-08-30T19:44:39.113 回答