Perl正则表达式匹配问题

Stu*_*ton 2 regex perl

我想我在这里错过了一些简单的东西......

$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?

干杯,斯图

Tim*_*ker 6

因为.*?是懒惰的,如果可以,将匹配零个字符.将正则表达式锚定到字符串的末尾:

$key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)$/
Run Code Online (Sandbox Code Playgroud)

但是,使用比全能.*和更明确的东西几乎总是更好.*?.告诉正则表达式引擎您想要匹配的内容.我建议假设分隔符-并且:从未出现在实际匹配中

$key =~ m/deco-([^-]*)-([^-]*)-([^:]*):([^:]*):([^:]*)$/
Run Code Online (Sandbox Code Playgroud)
  • [^-]表示"匹配任何字符除外-".
  • [^:]表示"匹配任何字符除外:".