尝试为自己创建一个用于 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 命令的字符串,该字符串应该位于匹配行尾的 $ 之前。