Регулярное выражение для буквенно-цифровой - PullRequest
6 голосов
/ 16 июня 2011

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

Это должно работать для:

"1a1b23nh" Принят

"bc112w" Принят

"abc" Не принимается

"123" Не принято

Специальные символы недопустимы.

Ответы [ 5 ]

5 голосов
/ 16 июня 2011
([0-9]+[a-zA-Z][0-9a-zA-Z]*)|([a-zA-Z]+[0-9][0-9a-zA-Z]*)
3 голосов
/ 16 июня 2011
(([a-z]+[0-9]+)+|(([0-9]+[a-z]+)+))[0-9a-z]*

Как насчет простой проверки контента? Проверьте, есть ли номер (а) и символ (ы)

String input = "b45z4d";
boolean alpha = false;
boolean numeric = false;
boolean accepted = true;
for (int i = 0; i < input.length(); ++i)
{
    char c = input.charAt(i);
    if (Character.isDigit(c))
    {
        numeric = true;
    } else if (Character.isLetter(c))
    {
        alpha = true;
    } else
    {
        accepted = false;
        break;
    }
}

if (accepted && alpha && numeric)
{
    // Then it is correct
}
2 голосов
/ 16 июня 2011

Я знаю, что на этот вопрос уже дан ответ, и он принят, но вот что я бы сделал:

Pattern pattern = Pattern.compile("(?i)(?:((?:\\d+[a-z]+)|(?:[a-z]+\\d+))\\w*)");

Object[][] tests = new Object[][] {
        { "1a1b23nh", Boolean.valueOf(true) },
        { "bc112w", Boolean.valueOf(true) },
        { "abc", Boolean.valueOf(false) },
        { "123", Boolean.valueOf(false) }
};

for (Object[] test : tests) {
    boolean result = pattern.matcher((String)test[0]).matches();
    boolean expected = ((Boolean)test[1]).booleanValue();
    System.out.print(test[0] + (result ? "\t " : "\t not ") + "accepted"); 
    System.out.println(result != expected ? "\t test failed" : "");
}
System.out.println("\nAll checks have been executed");

(? I) делает регистр нечувствительным к регистру.

0 голосов
/ 16 июня 2011

извините за пример javascript, я бы разбил его, чтобы избежать трудно читаемого регулярного выражения.

function valid(s) {
  return /^[a-z0-9]+$/i.test(s) &&
         /[a-z]+/i.test(s) &&
         /[0-9]+/.test(s)
}

valid('123a87') ; //# =>  true
valid('A982') ; //# =>  true
valid('$54 ') ; //# =>  false
valid('123') ; //# =>  false
valid('abd') ; //# =>  false
0 голосов
/ 16 июня 2011

Это Python, тот же шаблон должен работать в Java:

>>> import re
>>> re.compile('[0-9a-z]*[0-9][0-9a-z]*[a-z][0-9a-z]*|[0-9a-z]*[a-z][0-9a-z]*[0-9][0-9a-z]*', re.I)
<_sre.SRE_Pattern object at 0x830fbd0>
>>> p=_
>>> for s in '1a1b23nh', 'bc112w', 'abc', '123':
...  print s, p.match(s)
... 
1a1b23nh <_sre.SRE_Match object at 0xb73a3d78>
bc112w <_sre.SRE_Match object at 0xb73a3d78>
abc None
123 None

на 2-й мысли, лучше добавить '$' в конце, или оно будет соответствовать 'ab12 /'

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