2013-02-28 125 views
4

我想出了这个正则表达式:正则表达式验证逗号分隔的年份范围

(?:[0-9]{4}-([0-9]{4}|[?]))+ 

对于这样的文字:

1993-2000,2004-? 

来捕获块中的正则表达式= [0-9]{4}-([0-9]{4}|[?])

我有变化如:

 
1993-? 
1993-2000 
1993-2000,2004-? 
1993-2000,2004-2010 

等。

我的正则表达式捕获块[1993-2000][2004-?],但不是逗号。

我发现很难的是声明第二,第三等事件的逗号应该是强制性的。

那么,什么不应该被允许是:

 
1993-2000, 
1993-20002007-? 
?-2000 

可能这可以允许到0:1993-2000,2004,2007,2010-?

有人可以帮助我获得关于第二和后续出现的条件逗号这最后的理解?

我发现这个正则表达式,我适应了一下:

^([0-9]{4}(-([0-9]{4}|[?]))?)(,([0-9]{4}(-([0-9]{4}|[?]))?))*$ 

似乎这样的伎俩,但是这是最好的版本?

回答

2

你的正则表达式(最后一个)看起来不够好。关于过度拒绝或过度接受应该没有问题。有2个不必要的分组,但:

^[0-9]{4}(-([0-9]{4}|[?]))?(,[0-9]{4}(-([0-9]{4}|[?]))?)*$ 

你可以让所有的群体非获取,因为您要验证并不会捕捉到任何文本:

^[0-9]{4}(?:-(?:[0-9]{4}|[?]))?(?:,[0-9]{4}(?:-(?:[0-9]{4}|[?]))?)*$ 

\d可以就地使用的[0-9],但我认为这并不伤害宣布清楚。

相关问题