2013-02-28 126 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],但我認爲這並不傷害宣佈清楚。

相關問題