Regular Expression: Numeric range
如何编写一个与0或000到180之间的数值范围相匹配的正则表达式?
我不认为雷杰克斯是正确的选择。您是否尝试分析该值?如果必须使用regex,我将匹配
最简单的方法是将字符串解析为一个数字,并查找在适当范围内的数字。
要使用纯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) |
最近发布的
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中轻松指定:
或者,在人类可读的术语中是相同的:
1 2 3 4 | 0 000-099 100-179 180 |
如果需要两位数的范围,只需在regex中添加
此外,如果您在使用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)$ |
试试看。