Пароль совпадает с регулярным выражением - PullRequest
0 голосов
/ 24 ноября 2011

Я использую java.util.regex.Pattern для сопоставления паролей, соответствующих следующим критериям:

  1. Не менее 7 символов
  2. Должен состоять только из букв и цифр
  3. хотя бы одна буква и хотя бы одна цифра

У меня есть 1 и 2, но я не могу придумать, как сделать 3.

1 & 2 - [\\w]{7,}

Есть идеи?

Ответы [ 5 ]

4 голосов
/ 24 ноября 2011

Выполнение этого только с помощью Regex очень легко станет запутанным и очень трудным для понимания / чтения, если вам когда-нибудь понадобится изменить учетные данные для пароля.

Вместо этого перебирайте пароль в цикле и подсчитывайте различные типы символов, а затем выполняйте простые проверки if.

Например (не проверено):

if (password.length() < 7) return false;
int countDigit = 0;
int countLetter = 0;
for (int i = 0; password.length(); i++) {
    if (Character.isDigit(password.charAt(i)) {
        countDigit++;
    }
    else if (Character.isLetter(password.charAt(i)) {
        countLetter++;
    }
}

if (countDigit == 0 || countLetter == 0) {
    return false;
}

return true;
4 голосов
/ 24 ноября 2011

Вы можете использовать это.Это в основном использует lookahead для достижения 3-го требования.

(?=.*\d)(?=.*[a-zA-Z])\w{7,}

или строку Java

"(?=.*\\d)(?=.*[a-zA-Z])\\w{7,}"

Объяснение

"(?=" +         // Assert that the regex below can be matched, starting at this position (positive lookahead)
   "." +           // Match any single character
      "*" +           // Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
   "\\d" +          // Match a single digit 0..9
")" +
"(?=" +         // Assert that the regex below can be matched, starting at this position (positive lookahead)
   "." +           // Match any single character
      "*" +           // Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
"[a-zA-Z]" +       // Match a single character present in the list below
                     // A character in the range between “a” and “z”
                     // A character in the range between “A” and “Z”
")" +
"\\w" +          // Match a single character that is a “word character” (letters, digits, and underscores)
   "{7,}"          // Between 7 and unlimited times, as many times as possible, giving back as needed (greedy)

Редактировать

Если вы хотите включить поддержку букв в юникоде, используйте эту

(?=.*\d)(?=.*\pL)[\pL\d]{7,}
1 голос
/ 24 ноября 2011

Это возможно сделать это за одно регулярное выражение, но я бы не стал, так как это будет трудно поддерживать.

Я бы просто сделал:

if (pass.matches("[a-zA-Z0-9]{7,}") &&
    pass.matches("[a-zA-Z]") &&
    pass.matches("\\d"))
{
    // password is OK
}

Тогда становится очевидным, как применять дополнительные ограничения к паролю - они просто добавляются с дополнительными предложениями && ....

NB. Я специально использовал [a-z] вместо \w, потому что я не уверен, что произойдет с \w, если вы будете использовать его в альтернативных локалях, где другие символы могут считаться "буквами".

1 голос
/ 24 ноября 2011

Вам не понадобится класс символов для использования \w, он сам по себе является классом символов. Однако это также соответствует подчеркиванию, которое вы не упомянули. Так что может быть лучше использовать пользовательский класс символов.

Для «хотя бы одной» части используйте упреждения:

/(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{7,}/

Вам может потребоваться добавить дополнительные экранированные символы, чтобы он работал с Java *.

* что, к сожалению, я не могу помочь!

0 голосов
/ 24 ноября 2011

Я бы добавил еще одно регулярное выражение, чтобы покрыть 3-ий критерий (вам не нужно прибивать их все в одном регулярном выражении, но вы можете захотеть объединить их). Я бы пошел с чем-то вроде ^(?=.*\d)(?=.*[a-zA-Z])

взято отсюда- http://www.mkyong.com/regular-expressions/10-java-regular-expression-examples-you-should-know/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...