¿Cuál es el patrón de expresiones regulares para fecha y hora (2008-09-01 12:35:45)?

StackOverflow https://stackoverflow.com/questions/37732

  •  09-06-2019
  •  | 
  •  

Pregunta

¿Cuál es el patrón RegEx para DateTime (2008-09-01 12:35:45)?

Recibo este error:

No se encontró el delimitador final '^'

Usando:

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00))|0?[1-9]|1\d|2[0-8])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45');

Da este error:

Advertencia:preg_match() [función.preg-match]:La compilación falló:nada que repetir en el desplazamiento 0 en E:\www\index.php en la línea 19

¿Fue útil?

Solución

@Espo:Sólo tengo que decir que la expresión regular es increíble.Odiaría tener que escribir el código que hiciera algo útil con las coincidencias, como si realmente quisieras saber qué fecha y hora escribió el usuario.

Parece que la solución de Tom sería más sostenible, ya que es un millón de veces más simple y con la adición de algunos paréntesis se pueden obtener fácilmente los valores que el usuario escribió:

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

Si estás usando Perl, puedes obtener los valores con algo como esto:

$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;

Otros idiomas tendrán una capacidad similar.Tenga en cuenta que deberá realizar algunas modificaciones menores en la expresión regular si desea aceptar valores como meses de un solo dígito.

Otros consejos

Una versión simple que funcionará para el formato mencionado, pero no para todos los demás según @Espos:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 

http://regexlib.com/REDetails.aspx?regexp_id=610

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(? =.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][ 26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]| 1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2 -9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0- 5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2}) ps


Esta RE valida las fechas y/o los patrones de tiempos.Días en febrero.También se validan por años bisiestos.Fechas:en formato DD/MM/YYYY o D/M/YY entre el 1/1/1600 - 31/12/9999.Los ceros principales son opcionales.Los separadores de fecha pueden ser guiones coincidentes (-), cortes (/) o períodos (.) Times:En el HH: MM: SS AM/PM Formato de 12 horas (12:00 am - 11:59:59 pm) o HH: MM: Formato de hora militar SS (00:00:00 - 23:59:59).El formato de tiempo de 12 horas:1) Puede tener un cero líder durante la hora.2) Los minutos y segundos son opcionales para el formato de 12 horas 3) AM o PM son necesarios y que sean sensibles a la caja.Tiempo militar 1) Debe tener un cero líder durante todas las horas menos de 10.2) Los minutos son manditoriales.3) los segundos son opcionales.Fechas y horarios:Combinación de los formatos anteriores.Una fecha primero que una hora separada por un espacio.Ej) DD/MM/YYYY HH: MM: SS


Editar:Asegúrese de copiar RegEx del sitio web regexlib.com, ya que StackOverflow a veces elimina/destruye caracteres especiales.

^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$
$date = "2014-04-01 12:00:00";

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches);

print_r($matches);

$partidos serán:

Array ( 
   [0] => 2014-04-01 12:00:00 
   [1] => 2014 
   [2] => 04 
   [3] => 01 
   [4] => 12 
   [5] => 00 
   [6] => 00
)

Una forma sencilla de dividir una cadena con formato de fecha y hora.

Con respecto a la respuesta de Imran desde el 1 de septiembre de 2008 a las 12:33, falta:En el patrón los patrones correctos son

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1);
print_r( $m1 );
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2);
print_r( $m2 );
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3);
print_r( $m3 );

esto regresa

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 

Aquí está mi solución:

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([012345][0-9])\:([012345][0-9])$/u

He modificado el patrón de expresiones regulares de http://regexlib.com/REDetails.aspx?regexp_id=610.El siguiente patrón debería coincidir con su caso.

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

AAAA-MM-DD HH:MM:SS

Las funciones preg de PHP necesitan que su expresión regular esté envuelta con un carácter delimitador, que puede ser cualquier carácter.No puedes usar este carácter delimitador sin escapar dentro de la expresión regular.Esto debería funcionar (aquí el carácter delimitador es /):

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

Si necesita hacer coincidir líneas que contienen solo fecha y hora, agregue ^ y $ al principio y al final de la expresión regular.

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

Enlace al preg_match() del manual de PHP

Aquí hay una versión simplificada (originada de la respuesta de Espo).Comprueba la exactitud de la fecha (incluso el año bisiesto), y hh:mm:ss es opcional
Ejemplos que funcionan:
- 31/12/2003 11:59:59
- 29-2-2004

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

Aquí está mi solución:

[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01][0-9]|2[0-3]):[0-5]\d

Regular expression visualization

Demostración de depuración

https://regex101.com/r/lbthaT/4

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top