Убедитесь, что определенные символы находятся в строке, независимо от положения, используя регулярное выражение в Golang - PullRequest
0 голосов
/ 20 апреля 2019

Я создаю супер простую функцию, чтобы пароль содержал определенные символы.А именно, пароль должен иметь следующее значение:

  • Одна строчная буква
  • Одна заглавная буква
  • Одна цифра
  • Один специальный символ
  • Нет пробелов, # или |

Я думал, что регулярное выражение будет самым простым способом сделать это.Но мне трудно понять, как это сделать на Голанге.В настоящее время у меня есть несколько отдельных функций регулярного выражения MatchString, которые я буду комбинировать для получения желаемой функциональности.Например:

lowercaseMatch := regexp.MustCompile(`[a-z]`).MatchString
uppercaseMatch := regexp.MustCompile(`[A-Z]`).MatchString
digitMatch := regexp.MustCompile(`\d`).MatchString
specialMatch := regexp.MustCompile(`\W`).MatchString
badCharsMatch := regexp.MustCompile(`[\s#|]`).MatchString
if (lowercaseMatch(pwd) 
        && uppercaseMatch(pwd) 
        && digitMatch(pwd)
        && specialMatch(pwd)
        && !badCharsMatch(pwd)) {
    /* password OK */
} else {
    /* password BAD */
}

Хотя это делает вещи довольно читабельными, я бы предпочел более краткое регулярное выражение, но я не знаю, как получить регулярное выражение для поиска одного символа в каждой из указанных выше категорий (независимо от должности).Может ли кто-нибудь указать мне правильное направление, как этого добиться?Кроме того, если есть лучший способ сделать это, чем регулярное выражение, я все уши.

Спасибо!

1 Ответ

2 голосов
/ 20 апреля 2019

Поскольку golang использует re2 , он не поддерживает положительный прогноз (? = Регулярное выражение), поэтому я не уверен, есть ли способ написать регулярное выражение, охватывающее все случаи.

Вместо этого вы можете использовать unicode пакет:

func verifyPassword(s string) bool {
    var hasNumber, hasUpperCase, hasLowercase, hasSpecial bool
    for _, c := range s {
        switch {
        case unicode.IsNumber(c):
            hasNumber = true
        case unicode.IsUpper(c):
            hasUpperCase = true
        case unicode.IsLower(c):
            hasLowercase = true
        case c == '#' || c == '|':
            return false
        case unicode.IsPunct(c) || unicode.IsSymbol(c):
            hasSpecial = true
        }
    }
    return hasNumber && hasUpperCase && hasLowercase && hasSpecial
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...