He modificado el siguiente code añadido por @ ph4r05 para generar una expresión regular también; aquí está la expresión regular:
^\s*($|#|\w+\s*=|(\?|\*|(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?(?:,(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?)*)\s+(\?|\*|(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?(?:,(?:[0-5]?\d)(?:(?:-|\/|\,)(?:[0-5]?\d))?)*)\s+(\?|\*|(?:[01]?\d|2[0-3])(?:(?:-|\/|\,)(?:[01]?\d|2[0-3]))?(?:,(?:[01]?\d|2[0-3])(?:(?:-|\/|\,)(?:[01]?\d|2[0-3]))?)*)\s+(\?|\*|(?:0?[1-9]|[12]\d|3[01])(?:(?:-|\/|\,)(?:0?[1-9]|[12]\d|3[01]))?(?:,(?:0?[1-9]|[12]\d|3[01])(?:(?:-|\/|\,)(?:0?[1-9]|[12]\d|3[01]))?)*)\s+(\?|\*|(?:[1-9]|1[012])(?:(?:-|\/|\,)(?:[1-9]|1[012]))?(?:L|W)?(?:,(?:[1-9]|1[012])(?:(?:-|\/|\,)(?:[1-9]|1[012]))?(?:L|W)?)*|\?|\*|(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:-)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?(?:,(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)(?:(?:-)(?:JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))?)*)\s+(\?|\*|(?:[0-6])(?:(?:-|\/|\,|#)(?:[0-6]))?(?:L)?(?:,(?:[0-6])(?:(?:-|\/|\,|#)(?:[0-6]))?(?:L)?)*|\?|\*|(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?(?:,(?:MON|TUE|WED|THU|FRI|SAT|SUN)(?:(?:-)(?:MON|TUE|WED|THU|FRI|SAT|SUN))?)*)(|\s)+(\?|\*|(?:|\d{4})(?:(?:-|\/|\,)(?:|\d{4}))?(?:,(?:|\d{4})(?:(?:-|\/|\,)(?:|\d{4}))?)*))$
Aquí está el código de Java:
private static String cronRegex = null;
public static String getCronRegex()
{
if (cronRegex == null)
{
// numbers intervals and regex
Map<String, String> numbers = new HashMap<String, String>();
numbers.put("sec", "[0-5]?\\d");
numbers.put("min", "[0-5]?\\d");
numbers.put("hour", "[01]?\\d|2[0-3]");
numbers.put("day", "0?[1-9]|[12]\\d|3[01]");
numbers.put("month", "[1-9]|1[012]");
numbers.put("dow", "[0-6]");
numbers.put("year", "|\\d{4}");
Map<String, String> field_re = new HashMap<String, String>();
// expand regex to contain different time specifiers
for (String field : numbers.keySet())
{
String number = numbers.get(field);
String range = "(?:" + number + ")(?:(?:-|\\/|\\," + ("dow".equals(field)? "|#" : "") +
")(?:" + number + "))?" + ("dow".equals(field)? "(?:L)?" : ("month".equals(field)? "(?:L|W)?" : ""));
field_re.put(field, "\\?|\\*|" + range + "(?:," + range + ")*");
}
// add string specifiers
String monthRE = field_re.get("month");
String monthREVal = "JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC";
String monthRERange = "(?:" + monthREVal + ")(?:(?:-)(?:" + monthREVal + "))?" ;
monthRE = monthRE + "|\\?|\\*|" + monthRERange + "(?:," + monthRERange + ")*" ;
field_re.put("month", monthRE);
String dowRE = field_re.get("dow");
String dowREVal = "MON|TUE|WED|THU|FRI|SAT|SUN";
String dowRERange = "(?:" + dowREVal + ")(?:(?:-)(?:" + dowREVal + "))?" ;
dowRE = dowRE + "|\\?|\\*|" + dowRERange + "(?:," + dowRERange + ")*" ;
field_re.put("dow", dowRE);
StringBuilder fieldsReSB = new StringBuilder();
fieldsReSB.append("^\\s*(").append("$") //
.append("|#") //
.append("|\\w+\\s*=") //
.append("|") //
.append("(")//
.append(field_re.get("sec")).append(")\\s+(")//
.append(field_re.get("min")).append(")\\s+(")//
.append(field_re.get("hour")).append(")\\s+(")//
.append(field_re.get("day")).append(")\\s+(")//
.append(field_re.get("month")).append(")\\s+(")//
.append(field_re.get("dow")).append(")(|\\s)+(")//
.append(field_re.get("year"))//
.append(")")//
.append(")")//
.append("$");
cronRegex = fieldsReSB.toString();
}
return cronRegex;
}
Estoy de ninguna manera un experto en expresiones regulares, pero al menos esto parece funcionar en todos los ejemplos dados por el cuarzo documentation
Tenga en cuenta que la validez como comprobó mediante este método no garantiza * * que una expresión funcionará. P.ej. 'isValidExpression (" 0 0 12 1/2 * MON-FRI * ")' devuelve verdadero, pero en el tiempo de ejecución arroja 'UnsupportedOperationException: Soporte para especificar un día de la semana Y un parámetro de día del mes no está implementado .' – Jonik
De hecho, es mejor también iniciar una expresión y dejar que el constructor llame a buildExpression para que esté seguro de que esta es una expresión válida para Quartz –
El método @AhmedHashem 'isValidExpression' ya inicia internamente un' CronExpression' y atrapa cualquier 'ParseException'. Entonces no debería ser diferente. – destan