Попытался создать (упрощенное) регулярное выражение для шаблонов 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 ответ1

0

Проблема в вашем регулярном выражении заключается в группировке второй части:

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

должно быть :

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

Потому что, как вы написали, \s+ (---) принадлежит только первой части OR, а следующие 2 не совпадают, потому что есть пробел.

Может быть, лучше сгруппировать варианты var вместе:

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

Есть хорошее место для проверки вашего регулярного выражения: http://www.regexr.com/

И это регулярное выражение может быть упрощено, и в текущем состоянии оно не совпадает со строкой, которая будет командой cron, которая должна стоять перед $, совпадающим с концом строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .