正则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)$
试试看