Ruby的正则表达式是否符合标准?

时间:2014-02-20 19:41:48

标签: ruby regex

我需要匹配以下字符串,主要用于crontab。

0 2 * * 0,1,2,3,4,5,6

是“0 2 * *”,后面跟着用逗号分隔的从0到6(即一周七天)的最多7个数字。以下是我从红宝石那里得到的。

$ irb
irb> /0 2 \* \* [0-6]((,[0-6]){0,6})/ =~ "0 2 * * 1,2"
=> 0
irb> /0 2 \* \* [0-6]((,[0-6]){0,6})/ =~ "0 2 * * 7"
=> nil
irb> /0 2 \* \* [0-6]((,[0-6]){0,6})/ =~ "0 2 * * 0,1,2,3,4,5,6,7"
=> 0

对于最后一个,为什么它仍然匹配?

然后我使用http://regexpal.com/测试相同的正则表达式。它按预期工作,表明我的正则表达式是正确的。

1 个答案:

答案 0 :(得分:2)

因为你的正则表达式没有被锚定,所以它将匹配包含它的任何字符串,即使字符串在模式之前或之后有额外的字符。

改变这个:

/0 2 \* \* [0-6]((,[0-6]){0,6})/

到此:

/^0 2 \* \* [0-6]((,[0-6]){0,6})$/

它会像你期望的那样工作。 ^锚定到一行的开头; $到最后。

当您在http://regexpal.com上尝试最后一个正则表达式和字符串时,您可能会注意到匹配的字符串部分突出显示:

  
    

0 2 * * 0,1,2,3,4,5,6 ,7

  

仅突出显示匹配的部分。这表明regexpal和Ruby正在做同样的事情,在这种情况下。