我試圖找出如何找到那些不是幾年(我定義一年只是一個數字,是四位寬。)正則表達式來發現數字不包括四位數字
的數。例如,我想拿起
1
12
123
但不 1234
爲了避免日期(4位)。
如果正則表達式也拿起12345
這是好的,但沒有必要爲解決這一問題
(注:這些要求似乎很奇怪他們是我堅持一個更大的解決方案的一部分)
我試圖找出如何找到那些不是幾年(我定義一年只是一個數字,是四位寬。)正則表達式來發現數字不包括四位數字
的數。例如,我想拿起
1
12
123
但不 1234
爲了避免日期(4位)。
如果正則表達式也拿起12345
這是好的,但沒有必要爲解決這一問題
(注:這些要求似乎很奇怪他們是我堅持一個更大的解決方案的一部分)
如果回顧後和前瞻可用,下面應該工作:
(?<!\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']
好的!但是......你的無表情的正則表達式在以下輸入中錯過了22和666666:'1 22 333 4444 55555 666666 7777777'。 – 2012-01-17 18:29:50
@MikeClark - 是的,這是一個棘手的問題,這就是爲什麼lookaround更可取。如果你只是在沒有邊界檢查的情況下執行了'(\ d {1,3} | \ d {5,})',那麼最終會得到更糟糕的結果,將中間的數字分開。 – 2012-01-17 18:33:55
切換第二個正則表達式使用似乎更好的單詞邊界,現在唯一的區別是當字母和數字混合時第二個不能匹配,'a333'會匹配第一個正則表達式,但不匹配第二個正則表達式。 – 2012-01-17 18:38:00
(\\d{0,4} | \\d{6,})
in java。
根據您使用正則表達式的味道,這可能會爲你工作:
(([0-9]{1,3})|([0-9]{5,}))
在什麼語言? – shift66 2012-01-17 18:15:43
你想用哪種語言?對不起,重複。 – itun 2012-01-17 18:17:27
對不起 - 我應該澄清一下:它是用vb.net和c#.net編寫的高級系統。我沒有看過代碼,但它可能是普通的舊:System.Text.RegularExpressions – JohnZaj 2012-01-17 18:52:40