Expressões regulares para trabalhar com data/hora
Mais um post da série sobre regex (Veja os anteriores aqui: Expressões regulares para trabalhar com HTML e Expressões regulares para trabalhar com números). Reuni algumas expressões regulares úteis para trabalhar com data e hora.
Valida data no formato HH:MM
^(0-10-9|20-3):(0-50-9)$
[Testar](http://regexpal.com/?flags=®ex=^%28[0-1][0-9] | [2][0-3]%29%3A%28[0-5][0-9]%29%24&input=12%3A30) |
Variação da anterior, porém não é necessário o separador
^(20|21|22|23|[0-1]d)[0-5]d$
[Testar](http://regexpal.com/?flags=®ex=^%2820 | 21 | 22 | 23 | [0-1]d%29[0-5]d%24&input=1540) |
Valida horas, com ou sem AM/PM. Os segundos não são obrigatórios
^(((0]?1-9]|1[0-2])(:|.)[0-50-9\((:|.)0-5]0-9])?( )?(AM|am|aM|Am|PM|pm|pM|Pm))|(([0]?[0-9]|1[0-9]|2[0-3])(:|.)[0-50-9\((:|.)0-50-9)?))$
[Testar](http://regexpal.com/?flags=®ex=^%28%28%28[0]%3F[1-9] | 1[0-2]%29%28%3A | .%29[0-5][0-9]%28%28%3A | .%29[0-5][0-9]%29%3F%28%20%29%3F%28AM | am | aM | Am | PM | pm | pM | Pm%29%29 | %28%28[0]%3F[0-9] | 1[0-9] | 2[0-3]%29%28%3A | .%29[0-5][0-9]%28%28%3A | .%29[0-5][0-9]%29%3F%29%29%24&input=03%3A40%20AM) |
Valida datas no formato dd/mm/yyyy hh:mm:ss
^((((31/(0?13578]|1[02]))|((29|30)/(0?[1,3-9]|1[0-2])))/(1[6-9]|[2-9]d)?d{2})|(29/0?2/(((1[6-9]|[2-9]d)?(0[48]|[2468048|1357926)|((16|2468048|357926)00))))|(0?[1-9]|1d|2[0-8])/((0?[1-9])|(1[0-2]))/((1[6-9]|[2-9]d)?d{2})) (20|21|22|23|[0-1]?d):[0-5]?d:[0-5]?d$
[Testar](http://regexpal.com/?flags=®ex=^%28%28%28%2831%2F%280%3F[13578] | 1[02]%29%29 | %28%2829 | 30%29%2F%280%3F[1%2C3-9] | 1[0-2]%29%29%29%2F%281[6-9] | [2-9]d%29%3Fd{2}%29 | %2829%2F0%3F2%2F%28%28%281[6-9] | [2-9]d%29%3F%280[48] | [2468][048] | [13579][26]%29 | %28%2816 | [2468][048] | [3579][26]%2900%29%29%29%29 | %280%3F[1-9] | 1d | 2[0-8]%29%2F%28%280%3F[1-9]%29 | %281[0-2]%29%29%2F%28%281[6-9] | [2-9]d%29%3Fd{2}%29%29%20%2820 | 21 | 22 | 23 | [0-1]%3Fd%29%3A[0-5]%3Fd%3A[0-5]%3Fd%24&input=12%2F04%2F1990%2014%3A00%3A50) |
Valida datas entre 1/1/1900 até 31/12/2099
(^((((01-9])|(1-20-9)|(3[0-1]))|([1-9]))x2F(((0[1-9])|(1[0-2]))|([1-9]))x2F(([0-9]{2})|(((19)|([2([0]{1})))([0-9]{2}))))$)
[Testar](http://regexpal.com/?flags=®ex=%28^%28%28%28%280[1-9]%29 | %28[1-2][0-9]%29 | %283[0-1]%29%29 | %28[1-9]%29%29x2F%28%28%280[1-9]%29 | %281[0-2]%29%29 | %28[1-9]%29%29x2F%28%28[0-9]{2}%29 | %28%28%2819%29 | %28[2]%28[0]{1}%29%29%29%28[0-9]{2}%29%29%29%29%24%29&input=12%2F04%2F1990) |
Valida data e hora ou somente hora ou somente data. Data no formato m/d/y
^(?=d)(?:(?:(?:(?:(?:0?13578]|1[02])(/|-|.)31)1|(?:(?:0?[1,3-9]|1[0-2])(/|-|.)(?:29|30)2))(?:(?:1[6-9]|[2-9]d)?d{2})|(?:0?2(/|-|.)293(?:(?:(?:1[6-9]|[2-9]d)?(?:0[48]|[2468048|1357926)|(?:(?:16|2468048|357926)00))))|(?:(?:0?[1-9])|(?:1[0-2]))(/|-|.)(?:0?[1-9]|1d|2[0-8])4(?:(?:1[6-9]|[2-9]d)?d{2}))($| (?=d)))?(((0?[1-9]|1[012])(:[0-5]d){0,2}( [AP]M))|([01]d|2[0-3])(:[0-5]d){1,2})?$
[Testar](http://regexpal.com/?flags=®ex=^%28%3F%3Dd%29%28%3F%3A%28%3F%3A%28%3F%3A%28%3F%3A%28%3F%3A0%3F[13578] | 1[02]%29%28%2F | - | .%2931%291 | %28%3F%3A%28%3F%3A0%3F[1%2C3-9] | 1[0-2]%29%28%2F | - | .%29%28%3F%3A29 | 30%292%29%29%28%3F%3A%28%3F%3A1[6-9] | [2-9]d%29%3Fd{2}%29 | %28%3F%3A0%3F2%28%2F | - | .%29293%28%3F%3A%28%3F%3A%28%3F%3A1[6-9] | [2-9]d%29%3F%28%3F%3A0[48] | [2468][048] | [13579][26]%29 | %28%3F%3A%28%3F%3A16 | [2468][048] | [3579][26]%2900%29%29%29%29 | %28%3F%3A%28%3F%3A0%3F[1-9]%29 | %28%3F%3A1[0-2]%29%29%28%2F | - | .%29%28%3F%3A0%3F[1-9] | 1d | 2[0-8]%294%28%3F%3A%28%3F%3A1[6-9] | [2-9]d%29%3Fd{2}%29%29%28%24 | %20%28%3F%3Dd%29%29%29%3F%28%28%280%3F[1-9] | 1[012]%29%28%3A[0-5]d%29{0%2C2}%28%20[AP]M%29%29 | %28[01]d | 2[0-3]%29%28%3A[0-5]d%29{1%2C2}%29%3F%24&input=04%2F12%2F1990%2014%3A30%3A45) |
Valida dias da semana em inglês, resumidos ou não
^(Sun|Mon|(T(ues|hurs))|Fri)(day|.)?$|Wed(.|nesday)?$|Sat(.|urday)?$|T((ue?)|(hu?r?)).?$
[Testar](http://regexpal.com/?flags=®ex=^%28Sun | Mon | %28T%28ues | hurs%29%29 | Fri%29%28day | .%29%3F%24 | Wed%28. | nesday%29%3F%24 | Sat%28. | urday%29%3F%24 | T%28%28ue%3F%29 | %28hu%3Fr%3F%29%29.%3F%24&input=Sunday) |
Valida datas no formato MMM dd, yyyy
^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?) 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?) (0?1-9]|([12]d)|30))|(Feb(ruary)? (0?[1-9]|1d|2[0-8]|(29(?=, ((1[6-9]|[2-9]d)(0[48]|[2468048|1357926)|((16|2468048|357926)00))))))), ((1[6-9]|[2-9]d)d{2}))
[Testar](http://regexpal.com/?flags=®ex=^%28%3F%3A%28%28%28Jan%28uary%29%3F | Ma%28r%28ch%29%3F | y%29 | Jul%28y%29%3F | Aug%28ust%29%3F | Oct%28ober%29%3F | Dec%28ember%29%3F%29%2031%29 | %28%28Jan%28uary%29%3F | Ma%28r%28ch%29%3F | y%29 | Apr%28il%29%3F | Ju%28%28ly%3F%29 | %28ne%3F%29%29 | Aug%28ust%29%3F | Oct%28ober%29%3F | %28Sept | Nov | Dec%29%28ember%29%3F%29%20%280%3F[1-9] | %28[12]d%29 | 30%29%29 | %28Feb%28ruary%29%3F%20%280%3F[1-9] | 1d | 2[0-8] | %2829%28%3F%3D%2C%20%28%281[6-9] | [2-9]d%29%280[48] | [2468][048] | [13579][26]%29 | %28%2816 | [2468][048] | [3579][26]%2900%29%29%29%29%29%29%29%2C%20%28%281[6-9] | [2-9]d%29d{2}%29%29&input=April%2012%2C%201990) |
Encontra nomes de meses em inglês
^(?:J(anuary|u(ne|ly))|February|Ma(rch|y)|A(pril|ugust)|(((Sept|Nov|Dec)em)|Octo)ber)$
[Testar](http://regexpal.com/?flags=®ex=^%28%3F%3AJ%28anuary | u%28ne | ly%29%29 | February | Ma%28rch | y%29 | A%28pril | ugust%29 | %28%28%28Sept | Nov | Dec%29em%29 | Octo%29ber%29%24&input=September) |
Valida datas no formato dd/mm/yyyy
^(((01-9]|[12]d|3[01])/(0[13578]|1[02])/(d{2}))|((0[1-9]|[12]d|30)/(0[13456789]|1[012])/(d{2}))|((0[1-9]|1d|2[0-8])/02/(d{2}))|(29/02/((0[48]|[2468048|1357926)|(00))))$
[Testar](http://regexpal.com/?flags=®ex=^%28%28%280[1-9] | [12]d | 3[01]%29%2F%280[13578] | 1[02]%29%2F%28d{2}%29%29 | %28%280[1-9] | [12]d | 30%29%2F%280[13456789] | 1[012]%29%2F%28d{2}%29%29 | %28%280[1-9] | 1d | 2[0-8]%29%2F02%2F%28d{2}%29%29 | %2829%2F02%2F%28%280[48] | [2468][048] | [13579][26]%29 | %2800%29%29%29%29%24&input=12%2F04%2F90) |
Encontra fusos horários
[-+]((0[0-9]|1[0-3]):([03]0|45)|14:00)
[Testar](http://regexpal.com/?flags=®ex=[-%2B]%28%280[0-9] | 1[0-3]%29%3A%28[03]0 | 45%29 | 14%3A00%29&input=-03%3A00) |
Valida datas no formato mm/dd/yyyy ou mm-dd-yyyy
^(((((((0?13578])|(1[02]))[.-/]?((0?[1-9])|([12]d)|(3[01])))|(((0?[469])|(11))[.-/]?((0?[1-9])|([12]d)|(30)))|((0?2)[.-/]?((0?[1-9])|(1d)|(2[0-8]))))[.-/]?(((19)|(20))?([dd))))|((0?2).-/]?(29)[.-/]?(((19)|(20))?(([02468048)|(1357926)))))$
[Testar](http://regexpal.com/?flags=®ex=^%28%28%28%28%28%28%280%3F[13578]%29 | %281[02]%29%29[.-%2F]%3F%28%280%3F[1-9]%29 | %28[12]d%29 | %283[01]%29%29%29 | %28%28%280%3F[469]%29 | %2811%29%29[.-%2F]%3F%28%280%3F[1-9]%29 | %28[12]d%29 | %2830%29%29%29 | %28%280%3F2%29[.-%2F]%3F%28%280%3F[1-9]%29 | %281d%29 | %282[0-8]%29%29%29%29[.-%2F]%3F%28%28%2819%29 | %2820%29%29%3F%28[d][d]%29%29%29%29 | %28%280%3F2%29[.-%2F]%3F%2829%29[.-%2F]%3F%28%28%2819%29 | %2820%29%29%3F%28%28[02468][048]%29 | %28[13579][26]%29%29%29%29%29%24&input=12%2F31%2F2009) |
Encontra meses válidos
^((0?[1-9])|(1[0-2]))$
[Testar](http://regexpal.com/?flags=®ex=^%28%280%3F[1-9]%29 | %281[0-2]%29%29%24&input=1) |
É isso ai. Abraço e até a próxima!