Если вам нужно сделать это в одном выражении, оно должно выглядеть примерно так:
^(?:(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[a-z])(?=.*[A-Z])(?=.*[!%,.;:])|(?=.*[a-z])(?=.*[0-9])(?=.*[!%,.;:])|(?=.*[A-Z])(?=.*[0-9])(?=.*[!%,.;:])).{8,}$
См. здесь на Regexr
Позитивные указатели ((?=.*[a-z])
) используются для проверки, содержит ли строка нужную вам группу символов.
Проблема в том, что вы хотите 3 из 4, что означает, что вы должны сделать чередование со всеми разрешенными комбинациями.
Последняя часть .{8,}
затем сопоставляет строку и проверяет не менее 8 символов.
^
и $
- это привязки, которые привязывают шаблон к началу и концу строки.
[!%,.;:]
- это класс символов, здесь вы можете добавить все символы, которые хотите включить. Может быть, проще использовать сценарий Unicode, например \p{P}
, для всех знаков пунктуации. Для получения более подробной информации смотрите здесь регулярные-выражения.info
Обновление
сравнить пароль с введенным именем пользователя, они должны отличаться
обычно вы можете создавать регулярные выражения, используя конкатенацию строк. Я понятия не имею, как это в вашем случае, когда вы положили регулярное выражение ...
как-то так (псевдо)
String Username = "FooBar";
regex = "^(?:(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])|(?=.*[a-z])(?=.*[A-Z])(?=.*[!%,.;:])|(?=.*[a-z])(?=.*[0-9])(?=.*[!%,.;:])|(?=.*[A-Z])(?=.*[0-9])(?=.*[!%,.;:]))(?i)(?!.*" + Username + ").+$";
Я также использовал здесь встроенный модификатор (?i)
, чтобы сопоставить его с независимым регистром. (?!.*
- начало отрицательного взгляда, то есть строка не должна содержать ...