模式匹配发出警告“量词在零长度表达时出乎意料”

时间:2013-10-22 20:35:58

标签: regex perl

我已经写了一个正则表达式来检查俱乐部会员号,其有效值为 1)pl-XXXX 2)gl-XXXX其中XXXX为1000-9999。

我的正则表达式工作正常,但我无法理解为什么会显示以下警告 -

"Quantifier unexpected on zero-length expression in regex; marked by <-- HERE in
m/^{2}[pl,gl]+[-]{1}+[1-9]{1}+[0-9]$ <-- HERE / at test.pl line 62."

我的代码:

if ($count == 3){       ## check club identifier ## 
    if ($_ =~ /^{2}[pl,gl]+[-]{1}+[1-9]{1}+[0-9]$/){
    say "Line4 Good: ", $currLine;
    } else {
    say "Error in Line 4: Not a club member ";
    }

2 个答案:

答案 0 :(得分:5)

这似乎是错误报告中的错误:它指向错误的地方,正则表达式的结束。它只是对正则表达式的开头作出反应:

/^{2}...

这是^(零长度表达式),后跟量词({2})。正如这里所示:

$ perl -lwe '/^{2}/'
Quantifier unexpected on zero-length expression in regex; marked by <-- HERE in
m/^{2} <-- HERE / at -e line 1.

如果你想匹配“1)pl-XXXX 2)gl-XXXX,其中XXXX是1000-9999。”你可能想要像

这样的东西
/^[pg]l-\d{4}/

或者,您可以将0排除在有效的第一个数字之外,但我发现这有点过分:

/^[pg]l-[1-9]\d{3}/

为避免部分匹配,您可以使用行锚点结束:

/^[pg]l-[1-9]\d{3}$/

或某种方式表示以下字符不是数字

/^[pg]l-[1-9]\d{3}(?!\d)/

后者在较长的字符串中很有用,例如foo=pl-1000,gl-2012

答案 1 :(得分:1)

我相信你需要这个正则表达式:

/^(?:pl|gl)[-]+[1-9][0-9]+$/