#regex #go
#регулярное выражение #Вперед
Вопрос:
Я пытаюсь выяснить, могу ли я объединить все эти инструкции в одну проверку регулярного выражения, но, не будучи особенно сведущим в регулярных выражениях, выполнение этих отдельных проверок — лучшее, что у меня есть на данный момент:
func ValidatePwd(pwd string) error {
pwdRuneCount := utf8.RuneCountInString(pwd)
containsAtLeastOneDigit, err := regexp.MatchString("[0-9]", pwd)
if err != nil {
return err
}
containsAtLeastOneLowercase, err := regexp.MatchString("[a-z]", pwd)
if err != nil {
return err
}
containsAtLeastOneUppercase, err := regexp.MatchString("[A-Z]", pwd)
if err != nil {
return err
}
containsAtLeastOneNonWordChar, err := regexp.MatchString(`[W]`, pwd)
if err != nil {
return err
}
if pwdRuneCount < PwdMinRuneCount || pwdRuneCount > PwdMaxRuneCount || !containsAtLeastOneDigit || !containsAtLeastOneLowercase || !containsAtLeastOneUppercase || !containsAtLeastOneNonWordChar {
return PwdErr
}
return nil
}
Комментарии:
1. Поскольку Go regexp не поддерживает поисковые запросы, вы не можете объединить их все в 1 регулярное выражение.
Ответ №1:
Это возможно, но это было бы некрасиво. Одно регулярное выражение должно было бы содержать 24 подвыражения вида [0-9].*[a-z].*[A-Z].*W
, чтобы соответствовать каждому из возможных порядков, в которых могут встречаться четыре требуемых типа символов. То, как вы делаете это сейчас, намного лучше.
Кстати, вместо проверки на наличие ошибок в ваших MatchString
вызовах (что означает, что регулярное выражение было недопустимым), вам, вероятно, следует предварительно скомпилировать их с помощью regexp.MustCompile
, которая паникует, если регулярное выражение недопустимо.