2015-05-20 67 views
1

我必須編寫一個匹配模式1-6/2011的正則表達式。 在這種情況下,/之前的數字不能大於12。 所以我必須選擇1-12之間的數字。正則表達式問題我堅持

我寫了一個正則表達式:

^[1-9][0-2]?\s*[-−—]\s*[1-9][0-2]?\s*/\s*2[01][0-9][0-9]$ 

不過,在這裏我得到20-6/2014也作爲搭配。

我試着用負向後看:

^[1-9](?<![2-9])[0-2]?\s*[-−—]\s*[1-9](?<![2-9])[0-2]?\s*/\s*2[01][0-9][0-9]$ 

在這裏,個位數都沒有得到確定。

+1

使用'|'更多。你可以像這樣匹配所有數字1-12:'([1-9] | 1 [0-2])' –

回答

1

您可以使用正則表達式的以下更新:

^(?:0?[1-9]|1[0-2])\s*[-−—]\s*(?:0?[1-9]|1[0-2])\s*/\s*\s*2[01][0-9]{2}$ 

demo

它不會匹配12-30/201412-31/201412-32/201413-31/201420-6/2014

它將匹配1-6/201102-12/2014

C#:

var lines = "1-6/2011\r\n02-12/2014\r\n12-30/2014\r\n12-31/2014\r\n12-32/2014\r\n13-31/2014\r\n20-6/2014"; 
var finds = Regex.Matches(lines, @"^(?:0?[1-9]|1[0-2])\s*[-−—]\s*(?:0?[1-9]|1[0-2])\s*/\s*\s*2[01][0-9]{2}\r?$", RegexOptions.Multiline); 

記住\r?只在必要的情況下我們測試用的多行模式。您可以在檢查單獨的值時將其刪除。

+0

我只需要1-12這兩種情況。寫這一個。 ^(?: 0 [1-9] |λ1 [0-2])\ S * [---] \ S *(?: 0 [1-9] |λ1 [0-2])\ S */\ s * \ s * 2 [01] [0-9] [0-9] $ – Maverick

+0

好的,我更新了答案。 –

+0

它解決了您的問題,還是您需要更多幫助? –

1

所以我要1-12

之間進行選擇的數字對於您可以使用正則表達式

(?:0?[1-9]|1[0-2]) 

觀看演示。以匹配

https://www.regex101.com/r/fJ6cR4/23

+0

@Maverick確實接受,如果它爲你工作 – vks

+0

似乎有這個正則表達式的問題,它給我超時,當我正在寫完整匹配的完整正則表達式即。 1-6/2011 – Maverick

+0

@Maverick使用https://www.regex101.com/r/fJ6cR4/26 – vks

0

最簡單的正則表達式與1-12是(1[0-2]?)|[2-9]

它匹配13原因1[0-2]?匹配1,但它在全正則表達式(1[0-2]?)|[2-9]\/\d\d\d\d並不重要。

1

你可以使用這個表達式:

^(?:[1-9]|1[0-2])\s*-\s*(?:[1-9]|1[0-2])\s*/\s*2[01]\d{2}$ 

RegEx Demo

+0

我得到時間了。 – Maverick

+0

檢查您的網站鏈接。當我添加幾個更多類型的連字符時,會導致正則表達式執行超過2秒。我嘗試過expresso,它很好。 – Maverick

+0

很難想象這個正則表達式是如何執行2秒的,因爲這是非常基本和簡單的正則表達式。如果你給我提供一些例子來重現這種緩慢,那麼我可以看看。 – anubhava