2012-07-16 8 views
5

Estoy tratando de crear una expresión regular para que coincida con una cadena que tenga una fecha en el formato de marca de tiempo MySQL, ex "2012-07-16 02:04: 33 ".Expresión regular para coincidir con el formato de indicación de fecha y hora de MySQL "YMD H: M: S"

No es tan fácil como parece, p. no deberías terminar con el 30 de febrero.

Sé que hay formas más fáciles de hacerlo, pero estoy dependiendo de poder pasar una cadena y una expresión regular para evaluar esa cadena.

Estaría encantado de recibir cualquier sugerencia.

Respuesta

12

La expresión regular:

/^(((\d{4})(-)(0[13578]|10|12)(-)(0[1-9]|[12][0-9]|3[01]))|((\d{4})(-)(0[469]|1‌​1)(-)([0][1-9]|[12][0-9]|30))|((\d{4})(-)(02)(-)(0[1-9]|1[0-9]|2[0-8]))|(([02468]‌​[048]00)(-)(02)(-)(29))|(([13579][26]00)(-)(02)(-)(29))|(([0-9][0-9][0][48])(-)(0‌​2)(-)(29))|(([0-9][0-9][2468][048])(-)(02)(-)(29))|(([0-9][0-9][13579][26])(-)(02‌​)(-)(29)))(\s([0-1][0-9]|2[0-4]):([0-5][0-9]):([0-5][0-9]))$/ 

hace el trabajo. Gracias por el aporte.

+1

¡Es bueno ver que ha publicado la respuesta que resolvió su problema para ayudar al próximo capítulo que aparece! – Fluffeh

+0

Esta respuesta es incorrecta utilizando la cadena de fecha y hora '2013-11-27 14:43:29'. http://codepad.viper-7.com/sOTV9U –

+0

'codepad.viper-7.com/sOTV9U - un codificador' es correcto. Falla con algunas fechas que incluyen '2013-11-27 14:43:29'. Encontré algunos errores tipográficos y lo solucioné: '/^(((\ d {4}) (-) (0 [13578] | 10 | 12) (-) (0 [1-9] | [12] [0 -9] | 3 [01])) | ((\ d {4}) (-) (0 [469] | 11) (-) (0 [1-9] | [12] [0-9] | 30)) | ((\ d {4}) (-) (02) (-) (0 [1-9] | [12] [0-9] | 2 [0-8])) | (([ 02468] [048] 00) (-) (02) (-) (29)) | (([13579] [26] 00) (-) (02) (-) (29)) | (([0- 9] [0-9] [0] [48]) (-) (02) (-) (29)) | (([0-9] [0-9] [2468] [048]) (-) (02) (-) (29)) | (([0-9] [0-9] [13579] [26]) (-) (02) (-) (29))) (\ s) (([0-1] [0-9] | 2 [0-4]): ([0-5] [0-9]): ([0-5] [0-9])) $/'Gracias henrikstroem . ¡Esto me ayudó mucho!:) – racl101

7

Deberías hacerlo en 2 pasos, en lugar de tratar de usar expresiones geográficas realmente complicadas.

Paso 1: Compruebe si el formato es correcto utilizando expresiones regulares. usar algo como

/^\d\d\d\d-(\d)?\d-(\d)?\d \d\d:\d\d:\d\d$/g

Paso 2: Si se trata de un partido, usar algo similar a strtotime() en PHP (o analizar el uso de las funciones de fecha y hora en el idioma que está utilizando) y comprobar si el resultado es válido, para eliminar fechas como el 30 de febrero.

+0

Bueno, no es realmente lo que estoy buscando. Generalmente estoy de acuerdo con el enfoque, pero necesito poder pasar una expresión regular junto con la cadena. – henrikstroem

+0

Te encontrarás con demasiados casos. Casos durante meses con diferente número de días, etc., y también problemas de 'día bisiesto'. –

+2

Después de una tonelada de búsqueda en Google, encontré esta bestia de una expresión regular: '/^(((\ d {4}) (-) (0 [13578] | 10 | 12) (-) (0 [1-9] | [12] [0-9] | 3 [01])) | ((\ d {4}) (-) (0 [ 469] | 11) (-) ([0] [1-9] | [12] [0-9] | 30)) | ((\ d {4}) (-) (02) (-) (0 [1-9] | 1 [0-9] | 2 [0-8])) | (([02468] [048] 00) (-) (02) (-) (29)) | (([13579 ] [26] 00) (-) (02) (-) (29)) | (([0-9] [0-9] [0] [48]) (-) (02) (-) (29)) | (([0-9] [0-9] [2468] [048]) (-) (02) (-) (29)) | (([0-9] [0-9] [13579 ] [26]) (-) (02) (-) (29))) (\ s ([0-1] [0-9] | 2 [0-4]): ([0-5] [0 -9]): ([0-5] [0-9])) $/'desde aquí [http://www.webdeveloper.com/forum/showthread.php?t=178277](http://www .webdeveloper.com/forum/showthread.php? t = 178277). – henrikstroem

Cuestiones relacionadas