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}|[?]))?))*$

似乎可以解决问题,但这是最好的版本吗?

4

1 回答 1

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],但我认为明确声明它并没有什么坏处。

于 2013-02-28T11:04:25.163 回答