2015-02-19 6 views
1
System.out.println(Pattern.matches("[A-Z]{1,}[a-z]{1,}[0-9]{2,}[@#$%]+[ ]*", "DEFabc45$ ")); 

но это не работает. Когда я передаю строку, как [email protected]. Значит, я не должен следовать шаблону порядка регулярных выражений, написанному здесь.Проверка пароля по regex

Ниже приведены условия приведены ниже:

Написать функцию boolean isValidPassword (String password) Пароль является действительным, если он удовлетворяет следующим условиям:

  1. Длина пароля должна быть не более 10 (без учета пространства) ,
  2. Пароль должен содержать как минимум один капитал и один маленький алфавит
  3. Пароль должен содержать не менее 2-х цифр, а если он не содержит 2 цифры, то см. Следующее условие.
  4. Пароль должен содержать по крайней мере один специальный символ из заданного комплекте- {$, @, _, -,, /.}
+0

это может помочь http://stackoverflow.com/questions/5068843/password-validation-regex – davide

+5

Regex - неправильный инструмент здесь - в то время как вы * можете * уметь кодировать требования, поскольку это приведет к очень сложному выражение. Это почти наверняка будет невозможно понять и, следовательно, поддерживать, когда вы вернетесь к нему позже. Это было бы гораздо лучше разрешено с помощью некоторых простых инструкций кода в Java и гораздо более читаемым. – Paolo

+0

Обычно im all для регулярного выражения, но как только вы переходите к логике «если это не так», регулярное выражение, вероятно, не так. – Srb1313711

ответ

1

Вы можете использовать метод, связанный в @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, но вам нужно добавьте .* в конец, чтобы добраться до конца строки.

+0

«Это почти наверняка будет невозможно понять и, следовательно, поддерживать, когда вы вернетесь к нему позже». подумайте, что вы хорошо проиллюстрировали мою точку зрения: D – Paolo

+1

@Paolo: Мы можем провести параллель с обучением чтению: когда вы распознаете слова и идиоматические выражения, конструкции, вы можете сразу понять смысл предложения. Неспособность понять образец (настолько простой и известный здесь) объясняется недостатком навыков. Но если это умение приобретено, переписать или изменить такой шаблон занимает 5 минут душ включен, как и любая другая вещь. –

+0

Я думаю, что это решение неверно. Условие гласит: «без учета пробелов». И не: «не может содержать пробелы». Я думаю, что лучше смешивать регулярное выражение, когда оно соответствует «нормальным» проверкам и методам, например '.replace (" "," "). Length()> 10' и т. Д. – UniversE

Смежные вопросы