我有一个变量,例如 $var = 1.2.3 或 $var = Variable/1.2.3。我正在尝试编写一个匹配并存储在 1 美元中的正则表达式。代码如下:
if ($var =~ m/[\w+\/\d+.\d+.\d+])/){
$a = $1;
}
如果任何 $var 占上风,我想在上述条件下匹配。请给我建议。谢谢你。
括号捕获。依赖 很容易出错$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 <<<
您应该删除该字符类。一个字符类只匹配一个字符。它不代表任何序列。此外,.
是正则表达式中的元字符。要从字面上匹配它,您需要对其进行转义。
然后,您需要/
使用量词将之前的部分设为可选,?
因为它不一定存在于字符串中:
if ($var =~ m/((?:\w+\/)?\d+\.\d+\.\d+)/){
$a = $1;
}
仅供参考,您可以为匹配运算符使用任何分隔符,以避免转义/
:
m!((?:\w+/)?\d+\.\d+\.\d+)!
尝试这个:
if ($var =~ m/(?>[a-z_][a-z0-9_]*+\/)?+[0-9]++\.[0-9]++\.[0-9]++/i) {
$a = $&;
}