Regex para data (AAAA-MM-DD)

Use /^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$/ para verificar se uma string inteira é uma data válida no formato (AAAA-MM-DD). Todos os exemplos abaixo foram testados contra o padrão, e você pode abri-los no Testador de Regex com as amostras já carregadas.

Atualizado em

/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$/
Abrir no Testador de Regex
EntradaResultado
2026-10-30✓ Correspondência
1999-01-01✓ Correspondência
2024-02-29✓ Correspondência
2026-13-01✗ Sem correspondência
2026-1-5✗ Sem correspondência
2026/10/30✗ Sem correspondência
26-10-30✗ Sem correspondência
2026-00-10✗ Sem correspondência

Como o padrão funciona

ParteSignificado
^\d{4}Ano com quatro dígitos
(?:0[1-9]|1[0-2])Mês 01–12
(?:0[1-9]|[12]\d|3[01])Dia 01–31
-Hífens literais entre as partes

Exemplos de código

JavaScript

const re = /^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$/;
re.test(value); // true or false

Python

import re

bool(re.fullmatch(r'\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])', value))

PHP

preg_match('/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$/', $value) === 1;

Observações e limitações

Uma regex pode verificar o formato, mas não o calendário: 2026-02-30 passa na validação. Após a correspondência, confirme com uma biblioteca de datas ou new Date(value) e compare as partes. Este é o formato ISO 8601 usado por <input type="date">.

Perguntas frequentes

Qual é a regex para data (AAAA-MM-DD)?
/^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$/ — ela corresponde à string inteira. Veja a tabela acima para entender o que cada parte faz.
Quais exemplos correspondem?
Dos exemplos testados, estes correspondem: 2026-10-30, 1999-01-01, 2024-02-29. Os outros não.
Como testo esta regex?
Clique em “Abrir no Testador de Regex” — o padrão, as flags e o texto de exemplo são carregados automaticamente, e as correspondências são destacadas enquanto você edita.