2009-09-04 271 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

如果您需要它正好三位数字,您可以删除?迹象 –