Regex для сложного пароля

Используйте /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/, чтобы проверить, что вся строка является корректным сложным паролем. Каждый пример ниже проверен по этому шаблону, а открыть его в Regex Tester можно с уже загруженными образцами.

Обновлено

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/
Открыть в Regex Tester
ВводРезультат
Passw0rd!✓ Совпадение
C0rrect-Horse✓ Совпадение
aB3$efgh✓ Совпадение
password✗ Нет совпадения
Password1✗ Нет совпадения
Sh0rt!✗ Нет совпадения
ALLCAPS123!✗ Нет совпадения

Как работает шаблон

ЧастьЗначение
(?=.*[a-z])Lookahead: хотя бы одна строчная буква в любом месте
(?=.*[A-Z])Хотя бы одна заглавная буква
(?=.*\d)Хотя бы одна цифра
(?=.*[^A-Za-z0-9])Хотя бы один специальный символ
.{8,}Всего восемь или более символов

Примеры кода

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;

Примечания и ограничения

Каждый lookahead проверяет одно правило, не поглощая символов, поэтому правила могут идти в любом порядке. Актуальные рекомендации NIST отдают предпочтение длине (15+ символов) и проверке по утёкшим паролям, а не правилам состава. Рассмотрите правило только по длине в сочетании с индикатором надёжности. Сгенерировать пароль можно с помощью Генератора паролей.

Часто задаваемые вопросы

Какое регулярное выражение для сложного пароля?
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$/ — оно совпадает со всей строкой. Таблица выше объясняет, что делает каждая часть.
Какие примеры совпадают?
Из проверенных примеров совпадают: Passw0rd!, C0rrect-Horse, aB3$efgh. Остальные не совпадают.
Как проверить это регулярное выражение?
Нажмите «Открыть в Regex Tester» — шаблон, флаги и образцы текста загрузятся автоматически, а совпадения будут подсвечиваться при редактировании.