Возможно ли выполнить все эти проверки строк в одном регулярном выражении?

#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 , которая паникует, если регулярное выражение недопустимо.