Regex “模式匹配发出警告”;零长度表达式上的量词“意外”;

Regex “模式匹配发出警告”;零长度表达式上的量词“意外”;,regex,perl,Regex,Perl,我已经编写了一个正则表达式,用于检查俱乐部成员编号,其有效值如下 1) pl XXXX2)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

我已经编写了一个正则表达式,用于检查俱乐部成员编号,其有效值如下 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."

这似乎是错误报告中的一个错误:它指向了错误的地方,即正则表达式的末尾。它只是对正则表达式开头的反应:

/^{2}...
它是一个
^
(零长度表达式),后跟一个量词(
{2}
)。如下所示:

$ perl -lwe '/^{2}/'
Quantifier unexpected on zero-length expression in regex; marked by <-- HERE in
m/^{2} <-- HERE / at -e line 1.
或者,您可以将
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

这似乎是错误报告中的一个错误:它指向了错误的位置,即正则表达式的结尾。它只是对正则表达式开头的反应:

/^{2}...
它是一个
^
(零长度表达式),后跟一个量词(
{2}
)。如下所示:

$ perl -lwe '/^{2}/'
Quantifier unexpected on zero-length expression in regex; marked by <-- HERE in
m/^{2} <-- HERE / at -e line 1.
或者,您可以将
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

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

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

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

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

也许你的意思是
[1-9][0-9]+
。和
-
而不是
[-]+
。也许你的意思是
[1-9][0-9]+
。和
-
而不是
[-]+
。同样地,
[-]{1}+
也是错误的。这是一行中的两个量词:无用的
{1}
(正好一次),然后
+
(一次或多次)。@amon Yes。而且
[pl,gl]+
也不是很正确。我只关注了错误本身。gl-12345也正在得到验证(因为这并不是将XXXX限制为四位数字),我想验证它,直到只有四位数字,并且gl-12345在这种情况下不应有效。您必须使用线端锚,或者用某种方式表示它不可能是5。我假设你知道
$
,因为你自己用过它。同样地,
[-]{1}+
也是错误的。这是一行中的两个量词:无用的
{1}
(正好一次),然后
+
(一次或多次)。@amon Yes。而且
[pl,gl]+
也不是很正确。我只关注了错误本身。gl-12345也正在得到验证(因为这并不是将XXXX限制为四位数字),我想验证它,直到只有四位数字,并且gl-12345在这种情况下不应有效。您必须使用线端锚,或者用某种方式表示它不可能是5。我假设你知道
$
,因为你自己用过它。这
{1}+
是关于什么的?这
{1}+
是关于什么的?