关于正则表达式:正则表达式:数字范围

Regular Expression: Numeric range

如何编写一个与0或000到180之间的数值范围相匹配的正则表达式?


我不认为雷杰克斯是正确的选择。您是否尝试分析该值?如果必须使用regex,我将匹配\d{1,3}解析字符串,然后在代码中验证该数字。


最简单的方法是将字符串解析为一个数字,并查找在适当范围内的数字。

要使用纯regex执行此操作,需要标识模式并将其写出:

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

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

更直接的方法可能是

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

它只是为可能存在的每个棘手的数字范围交替出现。


有一个在线实用程序可以在utilitymill.com上生成这些问题,返回:

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


最近发布的rgxg命令行工具生成与特定数字范围匹配的正则表达式:

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

有关详细信息,请参阅http://rgxg.sf.net。


我的两分钱:

任何发布此问题答案的人都应该至少使用以下输入测试他们的regex:

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

不应匹配:0000、0095、181、190

我想约翰内斯R?SSEL写的是关于你能得到的最好的:

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


试试这个:

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


我将分解范围,以便在单独的regex中轻松指定:

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

或者,在人类可读的术语中是相同的:

1
2
3
4
0
000-099
100-179
180

如果需要两位数的范围,只需在regex中添加[0-9][0-9]

此外,如果您在使用regex时遇到问题,请尝试以使regex运算符尽可能清晰的方式指定它们-通常有一种方法可以以使它们的功能更加清晰的方式表示它们,特别是当您在其中执行此操作的语言允许您将regex规范的各个部分分隔成单独的部分时。E列和行..


可以使用下面的正则表达式

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


如果你不在乎负数

1
2
3
4
5
>> 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]
>>

我修改了Gumbo的:

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

试试看。