Preciso validar uma sequência de datas para o formato dd/mm/yyyy
com uma expressão regular.
Este regex valida dd/mm/yyyy
, mas não as datas inválidas, como 31/02/4500
:
^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$
O que é um regex válido para validar o dd/mm/yyyy
formato com suporte para o ano bissexto?
pattern
que recebe uma expressão regular, e os navegadores são validados automaticamente em relação à regex sem usar nenhum javascript. Apenas definindo uma regex no atributo pattern!Respostas:
A regex que você colou não valida os anos bissextos corretamente, mas existe uma que faz na mesma postagem . Eu modifiquei para levar
dd/mm/yyyy
,dd-mm-yyyy
oudd.mm.yyyy
.^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?: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])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
Eu testei um pouco no link que Arun forneceu em sua resposta e também aqui e parece funcionar.
Editar 14 de fevereiro de 2019: removi uma vírgula que estava no regex que permitia datas como
29-0,-11
fonte
DD/MM/YYYY
disso, esse regex também aceita, oDD/MM/YY
que não tenho certeza de que estava na intenção inicial do pôster. Se você deseja não suportar 'YY', remova todos os?
quantificadores opcionais .0?
por0
e também remova a última ocorrência de?
.?
que devem ser removidos: substitua todos(?:1[6-9]|[2-9]\d)?
por(?:1[6-9]|[2-9]\d)
.Estendi o regex fornecido por @Ofir Luzon para os formatos dd-mmm-AAAA, dd / mmm / AAAA, dd.mmm. AAAA, conforme meus requisitos. Qualquer pessoa com o mesmo requisito pode consultar isso
e testado para alguns casos de teste aqui http://regexr.com/39tr1 .
Para uma melhor compreensão desta expressão regular, consulte esta imagem:
fonte
8888
é um ano possível. Eu espero viver até essa idade.Aviso prévio:
Por isso, funciona corretamente apenas para [1901 - 2099] (Ufa) 😊
dd / MM / aaaa:
Verifica se o ano bissexto. Os anos de 1900 a 9999 são válidos. Apenas dd / MM / aaaa
fonte
29/02/2100
não existe (2100 NÃO é um ano bissexto), mas ainda é aceito pelo padrão fornecido.tente isso.
você pode testar expressões regulares em http://www.regular-expressions.info/javascriptexample.html facilmente.
fonte
30-02-2001
... de qualquer forma obrigado pela resposta :)Suspeito que o seguinte seja o mais preciso possível sem saber quando o local do usuário passou dos calendários juliano para o gregoriano.
Ele aceita '-', '/' ou nada como separadores entre ano, mês e dia, independentemente da ordem.
MMddyyyy:
ddMMyyyy:
aaaaMMdd:
Além da ordem, todos eles são precisos para o calendário juliano (ano bissexto a cada quatro anos) até 1700, quando o calendário gregoriano diverge do juliano. Tem dois problemas:
Isso foi testado contra a implementação do calendário de Java do ano 0001 até o ano de 9999, com a única discrepância nos 10 dias mencionados em 1582.
fonte
^([0-9]{4}[-/]?((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048])00)[-/]?02[-/]?29)$
. Testado com python: repl.it/repls/DependentBestChaptersPara quem olha para eles e fica completamente confuso, aqui está um trecho do meu roteiro. Infelizmente, tudo o que faz é corresponder a números válidos em uma entrada de data e hora e 31 de fevereiro será marcado como válido, mas como muitos disseram, o regex realmente não é a melhor ferramenta para fazer esse teste.
Para corresponder a uma data no formato 'aaaa-MM-dd hh: mm' (ou na ordem que você desejar)
O script acima começa criando um objeto regex. Em seguida, ele encontra todas as entradas cujos IDs correspondem a um determinado padrão e depois os percorre. Não testo a primeira entrada que encontro (
if (e > 0)
).Um pouco de explicação:
^
significa início da partida, enquanto que$
significa final da partida.\d+
meios corresponder a um único ou de uma sequência contígua de números inteiros, de modo quemyhtml_element_with_id_56_datetime
emyhtml_element_with_id_2_datetime
vai corresponder, masmyhtml_element_with_id_5a_datetime
não vaifonte
Aqui está outra versão do regex para corresponder a qualquer um dos seguintes formatos de data e permitir que os zeros à esquerda sejam omitidos:
Regex:
^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$
Partidas:
1/1/11 or 1.1.11 or 1-1-11 : true 01/01/11 or 01.01.11 or 01-01-11 : true 01/01/2011 or 01.01.2011 or 01-01-2011 : true 01/1/2011 or 01.1.2011 or 01-1-2011 : true 1/11/2011 or 1.11.2011 or 1-11-2011 : true 1/11/11 or 1.11.11 or 1-11-11 : true 11/1/11 or 11.1.11 or 11-1-11 : true
Demo de depuração
fonte
13/13/2000
= Partidas são verdadeiras #Aqui eu escrevi um para
dd/mm/yyyy
onde o separador pode ser de um-.,/
intervalo de anos0000-9999
.Ele lida com anos bissextos e é projetado para sabores regex, que oferecem suporte a lookaheads, capturando grupos e referências anteriores. NÃO é válido para, como
d/m/yyyy
. Se necessário, adicione mais separadores para[-.,/]
Teste no regex101 ; como uma sequência Java:
explicou:
Veja também as perguntas frequentes sobre o Regex do SO ; Por favor, deixe-me saber, se falhar.
fonte
Encontrei este reg ex aqui
Isso valida o formato
mm/dd/yyyy
e as datas válidas corretamente (mas nãom/d/yyyy
).Alguns testes
fonte
validará qualquer data entre
1900-2099
fonte
A seguinte expressão é agradável e fácil de manipular:
Ele valida de acordo com o formato MM / dd / AAAA e permite o suporte ao ano bissexto de 1960 a 2016. Se você precisar do suporte do ano bissexto estendido, basta manipular esta parte da expressão:
Espero que isso tenha ajudado muito
fonte
Outra resposta que valida o dia (dd), dependendo do mês (mm) e do ano (aaaa) (ou seja, também valida 29 de fevereiro em anos bissextos) e permite anos que variam de 0001 a 9999 (0000 em um ano inválido, de acordo com o gregoriano) calendário)
fonte
Estou trabalhando com uma API que aceita apenas o formato MM / DD / AAAA. Não consegui encontrar nenhum outro post que tenha pulado anos tão bem quanto a resposta de Ofir , então eu o aprimorei e estou postando novamente aqui para qualquer pessoa que possa precisar.
fonte
validará o
MM/DD/YYYY
formato com1960
para2028
se você precisar estender o suporte do ano bissexto, adicione
isso também é trabalho
se você pode alterar o formato
mm-dd-yyyy
de substituir[/]
a[-]
também verificar on-line http://regexr.com/fonte
Para a data MM / DD / AAAA, você pode usar
Ele verifica dias e mariposas adequados.
Lembre-se de que você pode verificar sua expressão regular em
regex101
qual eu recomendo :)
Diverta-se!
fonte
esse regex validará as datas no formato:
12-30-2016 (mm-dd-aaaa) ou 12-3-2016 (mm-d-aaaa) ou 1-3-2016 (md-aaaa) ou 1-30-2016 (m-dd-aaaa)
fonte
Eu sei que é uma resposta tangencial para a pergunta, mas se a intenção da pergunta é 'como validar uma data?', Por que não tentar deixar a linguagem de programação fazer todo o trabalho duro (se você estiver usando uma linguagem que pode)?
por exemplo, em php
fonte