我有一个变量,如$ var = 1.2.3或$ var = Variable / 1.2.3。我正在尝试编写一个匹配并存储在1美元的正则表达式。代码如下:
if ($var =~ m/[\w+\/\d+.\d+.\d+])/){
$a = $1;
}
如果任何$ var占优势,我想在上述条件下匹配。请建议我。谢谢。
答案 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 = $&;
}