Regex para senha forte

Use /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/ para verificar se uma string inteira é uma senha forte válida. Cada exemplo abaixo foi testado contra o padrão, e você pode abri-lo no Regex Tester com os exemplos já carregados.

Atualizado em

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/
Abrir no Regex Tester
EntradaResultado
Passw0rd!✓ Corresponde
C0rrect-Horse✓ Corresponde
aB3$efgh✓ Corresponde
password✗ Não corresponde
Password1✗ Não corresponde
Sh0rt!✗ Não corresponde
ALLCAPS123!✗ Não corresponde

Como o padrão funciona

ParteSignificado
(?=.*[a-z])Lookahead: pelo menos uma letra minúscula em algum ponto
(?=.*[A-Z])Pelo menos uma letra maiúscula
(?=.*\d)Pelo menos um dígito
(?=.*[^A-Za-z0-9])Pelo menos um símbolo
.{8,}Oito ou mais caracteres no total

Exemplos de código

JavaScript

const re = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/;
re.test(value); // true or false

Python

import re

bool(re.fullmatch(r'(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}', value))

PHP

preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/', $value) === 1;

Observações e limitações

Cada lookahead verifica uma regra sem consumir caracteres, então as regras podem aparecer em qualquer ordem. A orientação atual do NIST favorece tamanho (15+ caracteres) e verificação contra senhas vazadas em vez de regras de composição — considere uma regra apenas de tamanho mais um medidor de força. Gere uma com o Gerador de Senhas.

Perguntas frequentes

Qual é a regex para senha forte?
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/ — ela corresponde à string inteira. Veja a tabela acima para entender o que cada parte faz.
Quais exemplos correspondem?
Entre os exemplos testados, estes correspondem: Passw0rd!, C0rrect-Horse, aB3$efgh. Os outros não.
Como testo essa regex?
Clique em “Abrir no Regex Tester” — o padrão, as flags e o texto de exemplo carregam automaticamente, e as correspondências são destacadas conforme você edita.