你如何编写一个正则表达式来匹配从0或000到180的数字范围?
我认为正则表达式不是这个问题的正确选择。你是否尝试解析该值?如果必须使用正则表达式,我建议匹配\d{1,3}
,解析字符串,然后在代码中验证数字。
最简单的方法是将该字符串解析为数字,并查看数字是否在正确的范围内。
要使用纯正则表达式进行此操作,您需要识别模式并将其编写出来:
^(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)$
它只是在可能存在棘手的数字范围时进行交替。
最近发布的 rgxg
命令行工具可以生成匹配特定数字范围的正则表达式:
$ rgxg range -Z 0 180
(180|1[0-7][0-9]|0?[0-9]{1,2})
更多信息请参见https://rgxg.github.io。
我的建议:
任何回答这个问题的人都应该使用以下输入测试他们的正则表达式:
应匹配:0、00、000、5、05、005、95、095、180
不应匹配:0000、0095、181、190
我认为Johannes Rössel所写的内容是最好的:
^(0?[0-9]{1,2}|1[0-7][0-9]|180)$
-20..200|%{$_;"{0:00}"-f$_;"{0:000}"-f$_}|%{if ($_-match"^(0?[0-9]{1,2}|1[0-7][0-9]|180)$"){Write-Host -fore green $_}else{Write-Host -fore red $_}}
- Joey试试这个:
^(0|[1-9][0-9]?|1[0-7][0-9]|180)$
我会将范围分解,以便可以轻松地在单独的正则表达式中指定:
^(0|0[0-9][0-9]|1[0-7][0-9]|180)$
或者,用人类可读的术语来说:
0 000-099 100-179 180
如果您需要两位数的范围,只需将[0-9][0-9]
添加到正则表达式中即可。
此外,如果您在使用正则表达式时遇到问题,请尝试以尽可能清晰的方式指定它们的运算符 - 通常有一种方法可以以使其功能更加清晰的方式表示它们,特别是如果您所使用的语言允许您将正则表达式规范的部分分开成不同的列和行。
如果您不关心负数
>> 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]
>>
^([0-1]?[0-7]?[0-9])|180$
我修改了Gumbo的:
^(00?0?|0?[1-9][0-9]?|1[0-7][0-9]|180)$
试一下。
https://github.com/dimka665/range-regex
。它已经支持负值。当前的代码没有更新,所以你需要从该Github资源下载它。 - swdev