正则expression式:数字范围

你如何写一个正则expression式匹配0或000到180的数字范围?

最简单的方法是将stringparsing为一个数字,然后查找该数字是否在适当的范围内。

要用纯正则expression式来做到这一点,你需要识别模式并写出来:

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

这有三个select:一个用于单个和两个数字的数字(允许前导零),其中每个数字可以是0到9之间的任何数字。另一个指定在三位数字中的每个数字允许的数字范围数。 在这种情况下,这意味着第一个数字需要为1,第二个数字在0到7之间,最后一个可以是任何东西。 第三个select是只适用于其他地方不适合的数字180。

一个更直接的方法可能是

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

对于每个棘手的数字范围可能会有变化。

我不认为正则expression式是正确的select。 你有没有尝试parsing的价值? 如果必须使用正则expression式,我会匹配\d{1,3}parsingstring,然后validation代码中的数字。

在UtilityMill.com上有一个在线实用程序可以生成这些实用程序。对于您的问题,将返回:

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

最近发布的rgxg命令行工具会生成符合特定数字范围的正则expression式:

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

有关更多信息,请参阅http://rgxg.sf.net

我的两分钱:

任何人发布这个问题的答案应该至less用以下inputtesting他们的正则expression式

应匹配:0,00,000,5,05,005,95,095,180

不应该匹配:0000,0095,181,190

我认为JohannesRössel所写的就像你会得到的一样好:

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

尝试这个:

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

我会打破范围,以便它可以很容易地指定在单独的个人正则expression式:

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

或者,从人类可读的angular度来看,也是一样的:

 0
 000-099
 100-179
 180

如果你需要两位数的范围,只需要在正则expression式中加[0-9][0-9]即可。

另外,如果您在使用正则expression式时遇到问题,请尝试以正则expression式运算符尽可能清晰的方式指定它们 – 通常有一种方法可以使它们的function更加清晰,特别是如果语言你正在这样做允许你将正则expression式的部分分离成单独的列和行。

如果你不关心负数

 >> 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] >> 

你可以使用下面的正则expression式

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

我修改了Gumbo的:

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

试试看