我正在编写一个简单的命令行工具,我需要按以下格式匹配用户输入:
0; 60s(从0到60秒)
0; 60米(从0到60分钟)
所以,我需要确保:
最好的方法是什么?
非常感谢!
答案 0 :(得分:1)
一个可行的正则表达式是以下
/(\d{1,2})(s|m)/
它将匹配任何1或2位数字,后跟's'或'm',您将结果分别存储在$1
和$2
中。为了确保第一个在0到60之间,您可能需要检查0 <= $1.to_i <= 60
。
至于第二部分,如果你想要它;您可以在其中设置范围[0-60];[0-60](s|m)
,然后只需修改正则表达式
/(\d{1,2});(\d{1,2})(s|m)/
然后,您可以查看0 <= $2.to_i <= $1.to_i <= 60
和['s', 'm'].member? $3
。
答案 1 :(得分:1)
我会将基本模式与语义分开。也就是说,我会用正则表达式检查“digits-semicolon-digits-s / m”。然后我会以编程方式确保这些数字在所需的范围内。
这可能不是Ruby中最好的方法,但这是基本的想法:
input =~ /^(\d+);(\d+)[sm]$/
# make sure that 0 <= Integer($1, 10) < Integer($2, 10) <= 60
在第一行之后,$1
和$2
分别包含在第一组和第二组括号内找到的内容。
检查正则表达式中的[0,60]
范围也是可能的,但会变得不必要地丑陋。您将\d+
替换为[0-5]?[0-9]|60
。