2009-09-04 172 views
27

如何寫一個匹配從0或000到180的數字範圍的正則表達式?正則表達式:數字範圍

+1

http://www.regular-expressions.info/numericranges.html是一個非常有用的文章 – Bergi

+0

我相信你可以使用這個包'的https:// github.com/dimka665 /範圍-regex'。它已經支持負值。當前的代碼沒有更新,因此您必須從該github資源下載它。 – swdev

回答

28

最簡單的方法是將字符串解析爲數字,然後查找該數字是否在適當的範圍內。

要做到這一點用純正則表達式,你需要確定的模式,它寫出來:

^(0?[0-9]{1,2}|1[0-7][0-9]|180)$ 

這有三種選擇:一爲單,雙位數字(允許前導零),其中每個數字可以是0到9之間的任何數字。另一個指定三位數字中每個數字允許的數字範圍。在這種情況下,這意味着第一個數字需要爲1,第二個數字在0到7之間,最後一個數字可以是任何內容。第三種選擇只適用於其他地方的模式不適合的數字180。

更簡單的方法可能是

^(0{0,2}[0-9]|0?[1-9][0-9]|1[0-7][0-9]|180)$ 

剛剛交替用於每個棘手數值範圍可能存在。

+0

這樣做的竅門正如你也提到它必須匹配3位數字001,010,012等等這樣做謝謝 – Morten

2

試試這個:

^(0|[1-9][0-9]?|1[0-7][0-9]|180)$ 
+0

對於三重000'都不是。 –

+0

@Ionut G. Stan:我認爲只有匹配沒有前導零的數字太難了,這就是另一種選擇。 – Gumbo

32

我不認爲正則表達式是這個正確的選擇。你有沒有嘗試解析的價值?如果你必須使用正則表達式,我會匹配\d{1,3}解析字符串,然後驗證代碼中的數字。

+8

+1其他答案每個都至少有一個錯誤,這就是爲什麼這些任務不值得使用RE。 – soulmerge

+3

兩個bug甚至:(但是,我基本同意 – Joey

+1

在其他所有情況下,它可能更容易解析一個值,但它用於一個更大的正則表達式,它通過一個像54°11'56.234'' – Morten

0

我修改濃湯的:

^(00?0?|0?[1-9][0-9]?|1[0-7][0-9]|180)$ 

嘗試。

0

,如果你不關心負數

>> r = /\b(0?\d?\d|1[0-7]\d|180)\b/ 
=> /\b(0?\d?\d|1[0-7]\d|180)\b/ 
>> (0..200).map {|i| i.to_s =~ r } 
=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil] 
>> 
18

有一個在線工具來生成這些at UtilityMill.com對於你的問題,這將返回:

0*([0-9]{1,2}|1[0-7][0-9]|180) 
+0

作爲一般規則,我不會相信一個正則表達式我用RegexBuddy的經歷表明,它不是我的「夥伴」,也不能寫出體面的正則表達式。 –

+0

這是一個合作伙伴直接,但是。儘管它允許任意多個前導零。 – Joey

+0

@ paul-mcguire如果用戶嘗試輸入像1000這樣的值,可以忽略逗號嗎? – Vyache

1

我會打破這樣的範圍它可以很容易地在單獨的個人正則表達式中指定:

^(0|0[0-9][0-9]|1[0-7][0-9]|180)$

或者說,什麼是人類可讀的方面是相同的:

 
0 
000-099 
100-179 
180 

如果需要兩位數的範圍內,它只是一個加[0-9][0-9]的正則表達式的問題。

此外,如果您在使用正則表達式時遇到問題,請嘗試以使正則表達式運算符儘可能清晰的方式指定它們 - 通常有一種方法可以使它們的功能更加清晰,特別是如果您正在執行此操作的語言允許您將正則表達式規範的各個部分分離爲單獨的列和行。

+0

您忘記了一位數字1到9. –

+0

不,我只讀「0或000到180」並解釋爲:0作爲一位數字,或者三位數的範圍爲000至180。當我說「如果你需要兩位數的範圍......」我應該也提到了一個數字範圍,所以對此你是正確的。 – lcv

3

我的兩分錢:

任何人發佈的回答這個問題應該已經測試了他們的正則表達式至少以下輸入:

應符合:0,00,000,5,05, 005,95,095,180

不應該匹配:0000,0095,181,190

我認爲約翰內斯羅塞爾寫的是約一樣好,你會得到:

^(0?[0-9]{1,2}|1[0-7][0-9]|180)$ 
+1

PowerShell有助於驗證:'-20..200 |%{$ _;「{0:00}」 - f $ _;「{0:000}」 - f $ _} |%{if($ _-匹配「^(0?[0-9] {1,2} | 1 [0-7] [0-9] | 180)$」){Write-Host -fore green $ _} else {Write-Host - 前紅色$ _}}' – Joey

13

最近發佈rgxg命令行工具產生符合特定數量範圍的正則表達式:

$ rgxg range -Z 0 180 
(180|1[0-7][0-9]|0?[0-9]{1,2}) 

有關詳細信息,請參閱http://rgxg.sf.net

0

您可以使用正則表達式如下

^([0-1]?[0-7]?[0-9])|180$ 
+0

如果您需要它正好三位數字,您可以刪除?跡象 –