我想我在这里错过了一些简单的东西......
$key = "deco-1-LB-700F:MAR:40";
if ($key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)/) {
print "1=$1 2=$2 3=$3 4=$4 5=$5";
}
Run Code Online (Sandbox Code Playgroud)
这导致输出:1 = 1 2 = LB 3 = 700F 4 = MAR 5 =
为什么$ 5不能返回值40?
干杯,斯图
因为.*?是懒惰的,如果可以,将匹配零个字符.将正则表达式锚定到字符串的末尾:
$key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)$/
Run Code Online (Sandbox Code Playgroud)
但是,使用比全能.*和更明确的东西几乎总是更好.*?.告诉正则表达式引擎您想要匹配的内容.我建议假设分隔符-并且:从未出现在实际匹配中
$key =~ m/deco-([^-]*)-([^-]*)-([^:]*):([^:]*):([^:]*)$/
Run Code Online (Sandbox Code Playgroud)
[^-]表示"匹配任何字符除外-".[^:]表示"匹配任何字符除外:".