проверка пароля регулярного выражения - PullRequest
7 голосов
/ 17 февраля 2011

Как я могу получить это, чтобы он проверял 2 или более цифр в строке? Вызов спички на строку s.

s.matches("^[a-zA-Z0-9]{8,}$");

Ответы [ 6 ]

8 голосов
/ 17 февраля 2011

Это должно сделать это ...

^(?=.*[0-9].*[0-9])[a-zA-Z0-9]{8,}$

Единственное изменение, которое я сделал, это добавление этого (?=.*[0-9].*[0-9]), который является позитивным взглядом, который попытается найти первые 2 цифры в пароле.Если оно выполнено, то регулярное выражение будет работать как обычно.

Теперь я просто подумал, что хотел бы указать, что ваше регулярное выражение будет запрещать специальные символы (знаки пунктуации и тому подобное).На практике некоторым людям нравится вводить странные символы, подобные этим, в свои пароли.

Таким образом, вы можете рассмотреть что-то более похожее на это ...

^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$

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

1 голос
/ 17 февраля 2011

Как насчет этого?

private Pattern p1  = Pattern.compile("^\\w{8,}$");
private Pattern p2  = Pattern.compile("\\d+(.*)?\\d+");

private boolean match(String s) {
    return p1.matcher(s).find() && p2.matcher(s).find();
}

@Test
public void testPassword() {
    assertTrue("length at least 8", match("2aaaaaa2"));
    assertTrue("length at least 8", match("aaaaaaa22"));
    assertTrue("length at least 8", match("22aaaaaaa"));
    assertTrue("length at least 8", match("aa2aa2aaa"));

    assertFalse("length less than 8", match("2aa2aaa"));
    assertFalse("one digit", match("aa2aaaaa"));
    assertFalse("no digits", match("aaaaaaaa"));
}
1 голос
/ 17 февраля 2011

edit

Не используйте match, но find.(прочитайте документацию )

Метод match пытается сопоставить всю последовательность ввода с шаблоном. >

Вот почему \d.*\d не работает с a2a2a

Метод find сканирует входную последовательность в поисках следующей подпоследовательности, которая соответствует шаблону.

Это то, что вам нужно.

Вам просто нужно проверить, есть ли два числа с чем-то между \d.*\d:

import java.util.regex.*;
class TwoDigits { 
    public static void main( String ... args ) { 
        Pattern pattern = Pattern.compile("\\d.*\\d");
        Matcher matcher = pattern.matcher( args[0]  );  
        System.out.println("Matched ( found ) ? = " + matcher.find());
    }
}

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

C:\java>java TwoDigits ""
Matched ( found ) ? = false

C:\java>java TwoDigits "a"
Matched ( found ) ? = false

C:\java>java TwoDigits "1a1"
Matched ( found ) ? = true

C:\java>java TwoDigits "1a"
Matched ( found ) ? = false

C:\java>java TwoDigits "a1a"
Matched ( found ) ? = false

C:\java>java TwoDigits "a1a1"
Matched ( found ) ? = true

C:\java>java TwoDigits "2a2"
Matched ( found ) ? = true

C:\java>java TwoDigits "2aaa2"
Matched ( found ) ? = true

C:\java>java TwoDigits "2aaaaaaaaaaaaaaa2"
Matched ( found ) ? = true

C:\java>java TwoDigits "2aaaaaaaaaaaaaaa"
Matched ( found ) ? = false

C:\java>java TwoDigits "2aaaaaa2aaaaaaaaaa"
Matched ( found ) ? = true

C:\java>java TwoDigits "a3aaaaa2aaaaaaaaaa"
Matched ( found ) ? = true
1 голос
/ 17 февраля 2011

Попробуйте это: (?:^|\s+)(\w{8,})(?<=(.*\d.*\d.*))(?:\s+|$)

Модифицировано, чтобы допустить более 8 символов из: http://social.msdn.microsoft.com/Forums/en/regexp/thread/8e0ced1f-8ddc-4583-89de-e29b4c4dc726

1 голос
/ 17 февраля 2011

Я действительно не вижу веской причины проверять длину строки с помощью регулярного выражения - всегда упрощать это - хорошая идея, но особенно с регулярными выражениями возникает соблазн бросить все в совершенно нечитаемую строку (которая может иметьнекоторые странные случаи (это очень заманчиво)не забыли?после этого.\ d означает цифру в java - я не думаю, что есть какие-либо случаи с юникодом, которые вы пропустили бы с [0-9] - но лучше, чем потом сожалеть(только символы слова, т.е. [a-zA-Z_0-9])

1 голос
/ 17 февраля 2011

Совпадение дважды:

s.matches("^[a-zA-Z0-9]{8,}$");
s.matches("[0-9].*[0-9]");

Используйте результаты, как это:

if ( s.matches("^[a-zA-Z0-9]{8,}$") && s.matches("[0-9].*[0-9]") ) {
    # password is valid
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...