Регулярное выражение для проверки двух из трех критериев

58
6

Мне нужно создать регулярное выражение для соответствия строкам, которые удовлетворяют любым двум из следующих трех критериев: по крайней мере одно письмо в верхнем регистре, в лизинге одна строчная буква, по крайней мере одно число.


например, следующим результатом будет:


"TestString" = MATCH (upper & lower)
"TestSTring5" = MATCH (upper, lower, & number)
"teststring" = NO MATCH (lower)
"TESTSTRING" = NO MATCH (upper)
"teststring5" = MATCH (lower & number)
"345T" = MATCH (number & upper)

спросил(а) 2010-09-20T23:32:00+04:00 10 лет, 1 месяц назад
1
Решение
107

Это будет огромное регулярное выражение.


Вам нужно протестировать что-то вроде этого (только для чтения):

"[a-z].*[A-Z]|" +
"[A-Z].*[a-z]|" +
"[A-Z].*[0-9]|" +
"[0-9].*[A-Z]|" +
"[a-z].*[0-9]|" +
"[0-9].*[a-z]"

ответил(а) 2010-09-20T23:52:00+04:00 10 лет, 1 месяц назад
41

Я бы попробовал что-то по строкам:


([a-z][A-Z]|[A-Z][a-z]|[a-z][0-9]|[0-9][a-z]|[A-Z][0-9]|[0-9][A-z])

В основном это проверка на наличие любых пар вдоль линий:

    a1
    1a
    A1
    1A
    аА
    Аа

В вашей строке. Если ни одна из этих пар не соответствует, она терпит неудачу. Поскольку вы ищете любые два из трех критериев, которые должны быть выполнены, это работает путем поиска пар символов, соответствующих критериям.

ответил(а) 2010-09-20T23:58:00+04:00 10 лет, 1 месяц назад
41

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


псевдокод:


reHasUpper = /[A-Z]/ ;
reHasLower = /[a-z]/ ;
reHasNumber = /[0-9]/ ;

function validatePassword (pwd) {

metRequirements=0;

if (reHasUpper.test(pwd)) metRequirements++;
if (reHasLower.test(pwd)) metRequirements++;
if (reHasNumber.test(pwd)) metRequirements++;

return metRequirements > 1;

}

ответил(а) 2010-09-20T23:39:00+04:00 10 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема