我正在编写一个简单的命令行工具,我需要匹配以下格式的用户输入:
0;60 秒(从 0 到 60 秒)
0;60m(从 0 到 60 分钟)
所以,我需要确保:
- 第一个数字必须在 0 到 60 之间
- 第二个数字也必须在 0 到 60 之间
- 一定有 ”;” 范围之间
- 必须以“s”或“m”结尾
- 第二个数字必须大于第一个
最好的方法是什么?
非常感谢!
一个有效的正则表达式如下
/(\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
。
我会将基本模式与语义分开。也就是说,我会用正则表达式检查“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
.