2012-01-17 22 views
1

我試圖找出如何找到那些不是幾年(我定義一年只是一個數字,是四位寬。)正則表達式來發現數字不包括四位數字

的數。例如,我想拿起

1 

12 

123 

但不 1234爲了避免日期(4位)。

如果正則表達式也拿起12345這是好的,但沒有必要爲解決這一問題

(注:這些要求似乎很奇怪他們是我堅持一個更大的解決方案的一部分)

+1

在什麼語言? – shift66 2012-01-17 18:15:43

+0

你想用哪種語言?對不起,重複。 – itun 2012-01-17 18:17:27

+0

對不起 - 我應該澄清一下:它是用vb.net和c#.net編寫的高級系統。我沒有看過代碼,但它可能是普通的舊:System.Text.RegularExpressions – JohnZaj 2012-01-17 18:52:40

回答

5

如果回顧後和前瞻可用,下面應該工作:

(?<!\d)(\d{1,3}|\d{5,})(?!\d) 

說明:

(?<!\d)   # Previous character is not a digit 
(\d{1,3}|\d{5,}) # Between 1 and 3, or 5 or more digits, place in group 1 
(?!\d)    # Next character is not a digit 

如果您不能使用週轉,以下應該工作:

\b(\d{1,3}|\d{5,})\b 

說明:

\b     # Word boundary 
(\d{1,3}|\d{5,}) # Between 1 and 3, or 5 or more digits, place in group 1 
\b     # Word boundary 

Python的例子:

>>> regex = re.compile(r'(?<!\d)(\d{1,3}|\d{5,})(?!\d)') 
>>> regex.findall('1 22 333 4444 55555 1234 56789') 
['1', '22', '333', '55555', '56789'] 
+0

好的!但是......你的無表情的正則表達式在以下輸入中錯過了22和666666:'1 22 333 4444 55555 666666 7777777'。 – 2012-01-17 18:29:50

+0

@MikeClark - 是的,這是一個棘手的問題,這就是爲什麼lookaround更可取。如果你只是在沒有邊界檢查的情況下執行了'(\ d {1,3} | \ d {5,})',那麼最終會得到更糟糕的結果,將中間的數字分開。 – 2012-01-17 18:33:55

+0

切換第二個正則表達式使用似乎更好的單詞邊界,現在唯一的區別是當字母和數字混合時第二個不能匹配,'a333'會匹配第一個正則表達式,但不匹配第二個正則表達式。 – 2012-01-17 18:38:00

-1

(\\d{0,4} | \\d{6,}) in java。

0

根據您使用正則表達式的味道,這可能會爲你工作:

(([0-9]{1,3})|([0-9]{5,})) 
相關問題