Saltar al contenido

Cree una expresión regular para la declaración Cron

[*]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 0-59 * / , -
Horas 0-23 * / , -
Dia del mes 1-31 * / , - L W
Mes 1-12 o ENE-DIC * / , -
Día de la semana 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *