Perl正则表达式匹配问题

时间:2011-09-26 13:43:26

标签: regex perl

我想我在这里错过了一些简单的事情......

$key = "deco-1-LB-700F:MAR:40";
  if ($key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)/) {
      print "1=$1 2=$2 3=$3 4=$4 5=$5";
  }

这导致输出:1 = 1 2 = LB 3 = 700F 4 = MAR 5 =

为什么$ 5不会返回值40?

干杯,斯图

2 个答案:

答案 0 :(得分:6)

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

$key =~ m/deco-(.*?)-(.*?)-(.*?):(.*?):(.*?)$/

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

$key =~ m/deco-([^-]*)-([^-]*)-([^:]*):([^:]*):([^:]*)$/
  • [^-]表示“匹配-以外的任何字符”。
  • [^:]表示“匹配:以外的任何字符”。

答案 1 :(得分:2)

split qr/[:-]/, 'deco-1-LB-700F:MAR:40'

返回

(
    'deco',
    1,
    'LB',
    '700F',
    'MAR',
    40,
)