我需要匹配以下字符串,主要用于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/测试相同的正则表达式。它按预期工作,表明我的正则表达式是正确的。
答案 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正在做同样的事情,在这种情况下。