2014-09-14 7 views
2

Я пытаюсь написать функцию проверки пароля с помощью регулярного выражения и не знаю, как это сделать. Регулятор Golang отличается от другого языка. У кого-нибудь есть идея, как выглядит этот шаблон регулярного выражения?
Схема должна проверить:Проверка пароля с помощью regexp

/* 
* Password rules: 
* at least 7 letters 
* at least 1 number 
* at least 1 upper case 
* at least 1 special character 
*/ 
+0

Выражая это в одном регулярном выражении трудно. Я бы пошел с тремя регулярными выражениями и одним вызовом 'len()'. – Thomas

+0

Легко выполняется с обычным регулярным выражением, которое использует утверждения. В противном случае простая серия тестов символов: длина, символ цифры, верхняя альфа, пунктуация. – sln

+0

Уважаемый модератор M42, ваш «дублированный» вопрос не может применяться с go regexp (http://golang.org/pkg/regexp/syntax/), используя re2 (http://code.google.com/p/re2/ wiki/Синтаксис, эффективная, принципиальная библиотека регулярных выражений). В контексте Go это ** не является дубликатом **. – VonC

ответ

6

Права регулярного выражения будет ... не регулярное выражения здесь.

можно определить пользовательскую функцию, которая будет проверять достоверность пароля, и объединить его с другими рамочными помогают проверкам поля, как mccoyst/validate (упомянутое в этом discussion about parameter validation)

Вы также имеете go-validator/validator whic позволяет определить аналогичные валидации (но я бы по-прежнему использовал специальный валидатор вместо одного или нескольких регулярных выражений).


Примечание: go regexp основан на re2, эффективная, принципиален библиотека регулярных выражений).

Так что основные компромиссы не нетых обратных ссылок, например: (abc)\1 и ничего не найдена просмотровый зада.
В обмен вы получаете высокоскоростное регулярное выражение.

+0

Почему не регулярное выражение, это плохо? –

+0

@zero_coding здесь, так как вы не можете легко выразить ограничения в * one * regexp. Итак ... http://programmers.stackexchange.com/q/223634/3915 и http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/ – VonC

+0

Почему дизайнерский дизайн другое регулярное выражение, то другой язык? Какова причина? –

9

Это на самом деле невозможно, так как Go regex не поддерживает обратный отсчет.

Однако, это легко осуществить, простой пример:

func verifyPassword(s string) (sevenOrMore, number, upper, special bool) { 
    letters := 0 
    for _, s := range s { 
     switch { 
     case unicode.IsNumber(s): 
      number = true 
     case unicode.IsUpper(s): 
      upper = true 
      letters++ 
     case unicode.IsPunct(s) || unicode.IsSymbol(s): 
      special = true 
     case unicode.IsLetter(s) || s == ' ': 
      letters++ 
     default: 
      //return false, false, false, false 
     } 
    } 
    sevenOrMore = letters >= 7 
    return 
} 
Смежные вопросы