[*]Si encuentras algún detalle que no entiendes nos puedes dejar un comentario y haremos todo lo necesario de ayudarte rápidamente.
Solución:
[*]Para validar expresiones cron en general, dependerá en gran medida de la implementación específica que esté utilizando
Normas
Formato general
[*]En general, la mayoría se adhiere al siguiente formato:
Nombre del campo | ¿Obligatorio? | Valores permitidos | Caracteres especiales |
---|---|---|---|
Segundos | No* | 0-59 | * / , - |
Minutos | sí | 0-59 | * / , - |
Horas | sí | 0-23 | * / , - |
Dia del mes | sí | 1-31 | * / , - L W |
Mes | sí | 1-12 o ENE-DIC | * / , - |
Día de la semana | sí | 0-6 o SUN-SAT | * / , - L # |
Año | No* | 1970–2099 | * / , - |
[*]* donde los segundos y los años no son estándar y, a veces, no están incluidos
Macros de programación predefinidas:
[*]Algunos sabores permiten períodos de tiempo predefinidos como este:
Entrada | Equivalente a |
---|---|
@anualmente | 0 0 0 1 1 * * |
@anual | 0 0 0 1 1 * * |
@mensual | 0 0 0 1 * * * |
@semanalmente | 0 0 0 * * 0 * |
@diario | 0 0 0 * * * * |
@cada hora | 0 0 * * * * * |
@reiniciar |
Intervalos
[*]Algunos sabores permiten utilizar el @every
sintaxis con las siguientes unidades de intervalo de tiempo:
Unidad | Definición |
---|---|
ns |
nanosegundo |
us , µs |
microsegundo |
ms |
milisegundo |
s |
segundo |
m |
minuto |
h |
hora |
Validando
Macros predefinidas Regex
[*]Para validar macros predefinidas, puede utilizar la siguiente expresión regular:
/@(annually|yearly|monthly|weekly|daily|hourly|reboot)/
[*]Que pasará los siguientes casos de prueba:
@daily
@hourly
@every
Regex
[*]Validar @every
duraciones, puede utilizar la siguiente expresión regular:
/@every (d+(ns|us|µs|ms|s|m|h))+/
[*]Que pasará los siguientes casos de prueba:
@every 5s
@every 20h30m
Términos de Cron individuales
[*]Validar los términos cron en la expresión regular es un poco más complicado debido a que existen muchas variaciones.
[*]Solo concentrándome en un solo término, todos los siguientes son válidos:
- Dos o más números separados por un
,
- Dos números separados por un
/
o-
- Un número de 1-2 dígitos
- Un solo
*
[*]Para validar un solo término, podemos usar la siguiente expresión regular:
/(d+,)+d+|(d+(/|-)d+)|d+|*/
[*]dónde d+
solo garantiza que tiene 1 o más dígitos numéricos
[*]Que pasará los siguientes casos de prueba:
1,2,3
1,2
1/2
1-2
1
*
Combinando términos de Cron
[*]Para comprobar la expresión completa, podemos asegurarnos de que tenemos 5,7
términos con la siguiente expresión regular:
/(((d+,)+d+|(d+(/|-)d+)|d+|*) ?)5,7/
[*]Si quisiéramos distinguir entre cada término, necesitaríamos validar números dentro de un cierto rango:
Valores permitidos | Regex |
---|---|
0-59 | [1-5]?[0-9] |
0-23 | 2[0-3]|1[0-9]|[0-9] |
1-31 | 3[01]|[12][0-9]|[1-9] |
1-12 | 1[0-2]|[1-9] |
0-6 | [0-6] |
1970–2099 | 19[7-9][0-9]|20[0-9][0-9] |
[*]Sin embargo, si solo queremos asegurarnos de que algo aspecto como una expresión regular sin preocuparme por qué término es días frente a horas, la expresión se mantiene mucho más limpia, así que eso es lo que usaré para simplificar
Poniendolo todo junto
[*]Al combinar las declaraciones anteriores, podemos tener una verificación de cordura relativamente simple de que el término se ve regex-y con la siguiente expresión:
/(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (d+(ns|us|µs|ms|s|m|h))+)|((((d+,)+d+|(d+(/|-)d+)|d+|*) ?)5,7)/
Recursos adicionales
- crontab.guru
- regexr.com
[*]Acabo de terminar de escribir uno, así que aquí está el mío, espero que ayude.
[*]Esto debería permitir * o * / num y también limitar los valores numéricos a su rango lógico (1-12 para meses, 0-24 para horas, etc.)
/^(*|([0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])|*/([0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])) (*|([0-9]|1[0-9]|2[0-3])|*/([0-9]|1[0-9]|2[0-3])) (*|([1-9]|1[0-9]|2[0-9]|3[0-1])|*/([1-9]|1[0-9]|2[0-9]|3[0-1])) (*|([1-9]|1[0-2])|*/([1-9]|1[0-2])) (*|([0-6])|*/([0-6]))$/
[*]Me tomó un tiempo: D valida en base a esta documentación: http://en.wikipedia.org/wiki/Cron Sin embargo, no tiene en cuenta que no se puede especificar el día de la semana y el día del mes, es decir, se puede especificar ambos de acuerdo con esta expresión regular. Esto se puede usar para boost :: regex
(((([*])|(((([0-5])?[0-9])((-(([0-5])?[0-9])))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))(,(((([*])|(((([0-5])?[0-9])((-(([0-5])?[0-9])))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?)))* (((([*])|(((((([0-1])?[0-9]))|(([2][0-3])))((-(((([0-1])?[0-9]))|(([2][0-3])))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))(,(((([*])|(((((([0-1])?[0-9]))|(([2][0-3])))((-(((([0-1])?[0-9]))|(([2][0-3])))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?)))* (((((((([*])|(((((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))((-(((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))|(L)|(((((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))W))))(,(((((([*])|(((((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))((-(((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))|(L)|(((((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))W)))))*)|([?])) (((([*])|((((([1-9]))|(([1][0-2])))((-((([1-9]))|(([1][0-2])))))?))|((((JAN)|(FEB)|(MAR)|(APR)|(MAY)|(JUN)|(JUL)|(AUG)|(SEP)|(OKT)|(NOV)|(DEC))((-((JAN)|(FEB)|(MAR)|(APR)|(MAY)|(JUN)|(JUL)|(AUG)|(SEP)|(OKT)|(NOV)|(DEC))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))(,(((([*])|((((([1-9]))|(([1][0-2])))((-((([1-9]))|(([1][0-2])))))?))|((((JAN)|(FEB)|(MAR)|(APR)|(MAY)|(JUN)|(JUL)|(AUG)|(SEP)|(OKT)|(NOV)|(DEC))((-((JAN)|(FEB)|(MAR)|(APR)|(MAY)|(JUN)|(JUL)|(AUG)|(SEP)|(OKT)|(NOV)|(DEC))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?)))* (((((((([*])|((([0-6])((-([0-6])))?))|((((SUN)|(MON)|(TUE)|(WED)|(THU)|(FRI)|(SAT))((-((SUN)|(MON)|(TUE)|(WED)|(THU)|(FRI)|(SAT))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))|((([0-6])L))|(W)|(([#][1-5]))))(,(((((([*])|((([0-6])((-([0-6])))?))|((((SUN)|(MON)|(TUE)|(WED)|(THU)|(FRI)|(SAT))((-((SUN)|(MON)|(TUE)|(WED)|(THU)|(FRI)|(SAT))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))|((([0-6])L))|(W)|(([#][1-5])))))*)|([?]))((( (((([*])|((([1-2][0-9][0-9][0-9])((-([1-2][0-9][0-9][0-9])))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))(,(((([*])|((([1-2][0-9][0-9][0-9])((-([1-2][0-9][0-9][0-9])))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?)))*))?)
Sección de Reseñas y Valoraciones
[*]No se te olvide dar recomendación a esta sección si si solucionó tu problema.