1

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

0;60 秒(从 0 到 60 秒)

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

所以,我需要确保:

  • 第一个数字必须在 0 到 60 之间
  • 第二个数字也必须在 0 到 60 之间
  • 一定有 ”;” 范围之间
  • 必须以“s”或“m”结尾
  • 第二个数字必须大于第一个

最好的方法是什么?

非常感谢!

4

2 回答 2

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

于 2013-04-14T22:52:54.427 回答
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.

于 2013-04-14T22:56:30.863 回答