Вы можете использовать метод, связанный в @davide комментарий, поэтому в основном:
(?=(?: *\\S){10})(?=.*[a-z])(?=.*[A-Z])(?=.*[[email protected]_./-]|.*[0-9].*[0-9])
Однако использование .*
везде будет производить много возвратов (в частности .*[0-9].*[0-9]
), поэтому способ предотвратить это, чтобы быть более явным:
(?=(?: *\\S){10,})(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])[^[email protected]_./0-9-]*+(?:[[email protected]_./-]|[0-9][^0-9]*[0-9])
Об особенностях используемых в этих двух моделей:
\\S
является сокращенным классовый характер: все, что не бело-символ пробела
(?=...)
является нулевой ширины утверждение (тест) называется предпросмотр , и означает , а затем. Таким образом, вы можете проверить несколько утверждений из той же позиции, что и: (?=..)(?=..)(?=..)...
, так как символы не потребляются.
* Обратите внимание, что во втором шаблоне я выбрал не использовать lookahead, потому что, поскольку правил больше нет, не важно потреблять символы или нет.
Таким образом, каждый опережения содержит правило:
Правило 1: по крайней мере 10 символов без пробелов
(?=
(?: *\\S){10} # a group with optional spaces and one non space character
# the group is repeated 10 times, so there are at least
# 10 characters that are not a space
)
Правило 2а: строчной буквы
(?=
[^a-z]* # zero or more characters that are not a lowercase letter
[a-z] # until a lowercase letter
)
Правило 2B: верхнего регистра (то же, что и 2a, но с A-Z
)
правила 3 и 4 объединены в одном подмаска, не в упреждающей выборке, как объяснено:
[^[email protected]_./0-9-]*+ # all that is not a digit or a special character
# Note: I have added a possessive quantifier make the whole
# pattern to fail faster if the next group fails
(?: # two possibilities:
[[email protected]_./-] # a special character
| # OR
[0-9][^0-9]*[0-9] # two digits: a digit, other characters, an other digit
)
Вы можете использовать эти шаблоны, как это с lookingAt
, так как нет никакой необходимости, чтобы закрепить их в конце (в соответствии с вашими требованиями) или с matches
, но вам нужно добавьте .*
в конец, чтобы добраться до конца строки.
это может помочь http://stackoverflow.com/questions/5068843/password-validation-regex – davide
Regex - неправильный инструмент здесь - в то время как вы * можете * уметь кодировать требования, поскольку это приведет к очень сложному выражение. Это почти наверняка будет невозможно понять и, следовательно, поддерживать, когда вы вернетесь к нему позже. Это было бы гораздо лучше разрешено с помощью некоторых простых инструкций кода в Java и гораздо более читаемым. – Paolo
Обычно im all для регулярного выражения, но как только вы переходите к логике «если это не так», регулярное выражение, вероятно, не так. – Srb1313711