cron 模式的正则表达式不起作用

cron 模式的正则表达式不起作用

尝试为自己创建一个用于 cron 模式的(简化的)正则表达式,并得出以下结果:

^(((\d+(,\d+)*)|(\d+-\d+)|(\*(\/\d+)?))(\s+(\d+(,\d+)*)|(\d+-\d+)|(\*(\/\d+)?)){4})$

这是由

var variant1 = "\\d+(,\\d+)*";
var variant2 = "\\d+-\\d+";
var variant3 = "\\*(\\/\\d+)?";
var variants = "(" + variant1 + ")|(" + variant2 + ")|(" + variant3 + ")";
var regex_cron = "^((" + variants + ")(\\s+" + variants + "){4})$";

对于很多 cron 模式来说,这工作得很好:

* 4 45 6 7
5 4 45 6 7
*/5 3,4 45,6,8 6 5

但是如果我在“组”2 或更高级别中使用星号,则会失败:

4 * * * * 

我知道互联网上有几个可用于识别 cron 模式的正则表达式,但我真的很想知道在创建正则表达式时哪里出了问题。

答案1

您的正则表达式中的问题在于第二部分的分组:

var regex_cron = "^((" + variants + ")(\\s+" + variants + "){4})$";
                                        ---

应该 :

var regex_cron = "^((" + variants + ")(\\s+(" + variants + ")){4})$";
                                           !                !

因为正如您所写的, \s+ (---) 仅属于 OR 的第一部分,而接下来的两部分不匹配,因为有一个空格。

将变体 var 分组在一起可能是更好的做法:

var variants = "((" + variant1 + ")|(" + variant2 + ")|(" + variant3 + "))";

有一个很好的地方可以测试你的正则表达式:http://www.regexr.com/

并且这个正则表达式可以简化,并且在当前状态下它不匹配将成为 cron 命令的字符串,该字符串应该位于匹配行尾的 $ 之前。

相关内容