¿Cuál es la expresión regular para una fecha en el formato ’17 de marzo de 2016′?

¿Quieres hacer esta prueba en Excel VBA? Si es así, no necesita usar expresiones regulares.

Aquí hay una función definida por el usuario para probar si una fecha ingresada como una cadena ocurre en el formato 17 de marzo de 2016. Tal como está escrita, la función acepta entradas de fecha en mayúsculas, minúsculas o mayúsculas y minúsculas. No acepta ceros a la izquierda, nombres completos de meses o años de dos dígitos. Si el usuario incluye espacios adicionales, esos son tolerados.

Función ValidDate (sDate As String, Opcional sPattern As String = “mmm d, aaaa”) Como booleano
Dim dat As Date
Dim s As String
En Error Reanudar Siguiente
s = Application.Trim (UCase (sDate)) ‘Usa texto en mayúsculas y elimina espacios adicionales
dat = CDate (s)
ValidDate = (s = UCase (Formato (dat, “mmm d, aaaa”)))
En error GoTo 0
Función final

[AZ] [az] {2} \ s \ d {2}, \ s \ d {4}

Esto coincide con una letra mayúscula, seguida de 2 letras pequeñas, un espacio, un número de dos dígitos, una coma, un espacio y un número de cuatro dígitos.

Es bastante apretado, puedes aflojarlo un poco sin preocuparte por los casos, el número exacto de dígitos, etc.

Puede encontrar una respuesta en este enlace: Formato de fecha por país

Los países que usan el formato MMM DD, AAAA incluyen:

  • Canadá
  • Estados Unidos
  • Kenia (grupos de habla swahili)
  • Micronesia
  • Filipinas
  • Zimbabue

Según Wiki, este formato es utilizado por solo 500 millones de personas en todo el mundo. Si tuviera que adivinar, probablemente se relaciona con un deseo de ser diferente de la monarquía dominante que poblaba el Nuevo Mundo.

Así es como hablo naturalmente. Si digo el día primero y luego el mes en conversación, no me parece correcto. Con la posible excepción del “fin de semana del 4 de julio” o alguna referencia como esa.

Solo uso AAAAMMDD cuando quiero ordenar cronológicamente una base de datos o una hoja de cálculo. Podría usar DDMMYYYY pero solo si soy descuidado al copiar / pegar una fecha de una referencia en línea.

El formato completo, más fluido de la lengua, es día de la semana, mes, día, año, anno.

Este es un comienzo:

((Jan) | (Feb) | (Mar) | (Apr) | (May) | (Jun) | (Jul) | (Aug) | (Sep) | (Oct) | (Nov) | (Dec)) \ s ([1-9] | ([12] [0-9]) | (3 [01])), \ s \ d \ d \ d \ d
// lo anterior se puede mejorar aún más para responder solo a fechas válidas

Pero esto no calcula los días reales de cada mes (por lo que, por ejemplo, “31 de febrero de 2016” también coincidiría, solo calcula los nombres de los meses, las fechas entre 1 y 31 y los años de 0000 a 9999.

Si desea calcular la fecha exacta, puede hacerlo, pero la expresión se volvería aún más complicada. Puede ser mejor usar clases de fecha en bibliotecas estándar para verificar la fecha.

Va a ser muy complicado, incluso si lo limita al calendario gregoriano debido a la cantidad variable de días en cada mes, y las reglas peculiares que involucran años bisiestos (es más complicado que solo cada 4 años; hay una regla de 100 años, y una regla de 400 años también.)