2011-09-26 34 views
-1

我寫一個正則表達式表達式驗證從今年到2020年經常用於驗證年開始從2020年

下面開始正則表達式我寫的,

^(20-99)(20-99)$ 

它似乎並沒有工作。任何人都可以指出我哪裏弄錯了?

+2

你的第二組只接受值20-99,你需要接受00-99 。例如3000. –

+1

你的正則表達式只接受一個字符串:'「20-9920-99」'。在使用工具之前,請嘗試閱讀一下它:我認爲你沒有花太多時間學習。如果你這樣做了,你可能會得出這樣的結論:正則表達式不適合你的情況。 –

+0

@BartKiers謝謝,在看完JLundberg評論後,我意識到自己的錯誤。我必須承認正則表達式不是我的特長,使用比較運算符有更好的方法來做這件事,但由於需求限制,我必須使用正則表達式。 – Ted

回答

5

正則表達式不採用這樣的範圍。你會想要做的事,如:

if(year >= 2020) 
    presto 

我是輕率,因爲你想使用正則表達式,你可以只使用一個直接的比較。如果你有一個字符串,首先將字符串轉換爲一個整數(如果你甚至需要用Python來完成)。否則,你會有一些難以維護的非常難看的正則表達式。

編輯:如果你在使用正則表達式(或三個)真正熱衷,你的問題可以分爲三個正則表達式:^20[2-9]\d$^2[1-9]\d\d$^[3-9]\d{3}$爲四字年。你可以將它們組合成^(20[2-9]\d|2[1-9]\d\d|[3-9]\d{3})$

但是請注意,正則表達式是:a)醜得要命,和b)只接受年高達9999你可以明智地使用了+的緩解這一點,所以像:

^(20[2-9]\d+|2[1-9]\d{2,}|[3-9]\d{3,})$ 

。 ..可以工作。

但我希望你會發現,只是做year >= 2020是好多了。

編輯2:地獄,這正則表達式是錯誤的,近年來比9999更大您可能需要使用:

^(20[2-9]\d|2[1-9]\d{2}|[3-9]\d{3}|[1-9]\d{4,})$ 

和仍然如果你進入一個像今年03852不起作用。

+0

謝謝。但由於某些需求限制,我可能不會使用比較運算符。 – Ted

+0

@Ted請發佈您正在嘗試做的事情,以便我們可以提供一個替代方案。 – Gazler

+0

也許OP是...我不知道...在2020年之前和之後他需要消除歧義的地方寫一個PEG? –

1

不確定關於python,但w.r.t.以正則表達式它不會像你想的那樣工作......範圍是針對單個字符的。因此,如果由於某種原因,你必須一個正則表達式(即:某種正則表達式填充數據驗證引擎):

^20[2-9][0-9]|[2-9][1-9][0-9][0-9]$ 

從2020至2099年或2100-9999任何數字。

+2

看不到這3000年如何(即將到來)。 –

+0

你可以通過使用'\ d'作爲'[0-9]'的高爾夫球。 –

0

這裏是一個顯著較短的正則表達式,你想要做什麼:

^(?![01]|20[01])\d{4}$ 

驗證:

>>> regex = re.compile(r'^(?![01]|20[01])\d{4}$') 
>>> all(regex.match(str(x)) if x >= 2020 else not regex.match(str(x)) for x in xrange(10000)) 
True