正则表达式验证逗号分隔的年份范围

时间:2013-02-28 10:55:08

标签: javascript regex

我想出了这个正则表达式:

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

本文:

1993-2000,2004-?

要在block = [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}|[?]))?))*$

似乎可以做到这一点,但这是最好的版本吗?

1 个答案:

答案 0 :(得分: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],但我认为明确声明它并没有坏处。