xpertzgurtej Ответов: 2

Регулярное выражение в соответствии с условием


Мне нужна регулярная экспрессия в соответствии со следующими критериями

Пароль должен быть от 8 до 20 символов и иметь по крайней мере 1 специальный символ(!@#$+=?*_-) 1 числовой и 1 заглавный алфавит.

Примечание: специальный символ должен быть только из "!@#$+=?*_-"

Что я уже пробовал:

Я пытался "(?=^.{8,20}$)(?=.*\d) (?=.*[A-Z])(?=.*[!@#$&усилитель;?*_-])(?!.*\s).*$", но он также допускает другие символы.

2 Ответов

Рейтинг:
15

Andy Lanng

Быстрый ответ:

Цитата:
^(?=. *[A-Za-z]) (?=. * \d)(?=.*[!@#$+=?*_-])[а-за-з\д!@#$+=?*_-]{8,20}$


xpertzgurtej

он работает как и ожидалось

Andy Lanng

Полное раскрытие информации: я делаю это так, как предлагает Грифф (хотя я делаю это на стороне клиента).
Проблема здесь в том, что регулярное выражение дает вам ответ " ДА " или "нет". Рядом с моими паролями есть инструкции (список: "должен содержать хотя бы один верхний регистр" и т. д.), которые я выделяю красным цветом, если они не пройдены. Это дает лучшую обратную связь пользователю.

xpertzgurtej

я написал инструкцию ниже текстового поля пароля. Я просто хотел проверить, ввел ли пользователь действительный пароль в соответствии с правилом или нет.. Я думаю, что в этом случае ваш ответ на регулярное выражение будет в порядке. не так ли?

Andy Lanng

Это полностью зависит от вас. Я просто хотел, чтобы вы знали, что я не использую один и причины, почему. Я не хочу казаться сторонником каких-либо предпочтений, поскольку любой подход может соответствовать тому, для чего он вам нужен.
Другими словами: вы делаете вы ^_^

xpertzgurtej

спасибо за ваши предложения. :)

Рейтинг:
12

OriginalGriff

Не используйте регулярное выражение: это не подходящий инструмент для проекта.
Проблема в том, что регулярные выражения являются инструментами сопоставления шаблонов, а не обработки текста - они не "подсчитывают" экземпляры, что вам и нужно.
Вместо этого сделайте это в коде, где это и проще, и более ремонтопригодно.
Если это веб-сайт, то вы, вероятно, захотите сделать это на Javascript, а не на C#, чтобы сэкономить время туда и обратно на сервере.
Решение C# тривиально:

private char[] specials = { '(', '!', '@', '#', '$', '+', '=', '?', '*', '_', '-', ')' };
bool hasSpecial = input.IndexOfAny(specials) >= 0;
bool hasUpper = input.Any(c => char.IsUpper(c));
bool hasDigit = input.Any(c => char.IsDigit(c));
if (hasSpecial && hasUpper && hasDigit)
    {
    ...
    }


xpertzgurtej

спасибо за ваши предложения