Regex para hora (12 horas com AM/PM)

Use /^(?:0?[1-9]|1[0-2]):[0-5]\d ?[AaPp][Mm]$/ para verificar se uma string inteira é uma hora válida no formato 12 horas (AM/PM). 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

/^(?:0?[1-9]|1[0-2]):[0-5]\d ?[AaPp][Mm]$/
Abrir no Testador de Regex
EntradaResultado
9:30 AM✓ Corresponde
12:00pm✓ Corresponde
07:15 PM✓ Corresponde
13:00 PM✗ Não corresponde
9:30✗ Não corresponde
0:30 AM✗ Não corresponde
9:30 A.M.✗ Não corresponde

Como o padrão funciona

ParteSignificado
(?:0?[1-9]|1[0-2])Horas de 1 a 12, com zero à esquerda opcional
:[0-5]\dDois-pontos e minutos de 00 a 59
?Espaço opcional
[AaPp][Mm]AM ou PM em qualquer caixa (maiúscula ou minúscula)

Exemplos de código

JavaScript

const re = /^(?:0?[1-9]|1[0-2]):[0-5]\d ?[AaPp][Mm]$/;
re.test(value); // true or false

Python

import re

bool(re.fullmatch(r'(?:0?[1-9]|1[0-2]):[0-5]\d ?[AaPp][Mm]', value))

PHP

preg_match('/^(?:0?[1-9]|1[0-2]):[0-5]\d ?[AaPp][Mm]$/', $value) === 1;

Observações e limitações

Não existe 0:00 nem 13:00 em um relógio de 12 horas, então ambos são rejeitados.

Perguntas frequentes

Qual é a regex para hora (12 horas com AM/PM)?
/^(?:0?[1-9]|1[0-2]):[0-5]\d ?[AaPp][Mm]$/ — ela corresponde à string inteira. Veja a tabela acima para entender o que cada parte faz.
Quais exemplos correspondem?
Dos exemplos testados, estes correspondem: 9:30 AM, 12:00pm, 07:15 PM. Os outros não.
Como testo essa regex?
Clique em “Abrir no Testador de Regex” — o padrão, as flags e o texto de exemplo carregam automaticamente, e as correspondências são destacadas enquanto você edita.