Ruby - 正则表达式匹配范围,如0; 60s或0; 60m

时间:2013-04-14 22:42:23

标签: ruby regex

我正在编写一个简单的命令行工具,我需要按以下格式匹配用户输入:

0; 60s(从0到60秒)

0; 60米(从0到60分钟)

所以,我需要确保:

  • 第一个数字必须介于0到60之间
  • 第二个数字也必须介于0到60之间
  • 必须有“;”范围之间
  • 必须以“s”或“m”结束
  • 第二个数字必须是>比第一个

最好的方法是什么?

非常感谢!

2 个答案:

答案 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”。然后我会以编程方式确保这些数字在所需的范围内。

这可能不是Ru​​by中最好的方法,但这是基本的想法:

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