编译正则表达式时出现紧急情况

时间:2014-08-06 11:30:49

标签: regex go

我正在使用以下代码编写用于密码验证的正则表达式:

func IsPasswordValid(value string) bool {
    pattern := regexp.MustCompile(`^.*(?=.{7,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).*$`)
    return pattern.MatchString(value)
}

当我执行应用程序时,它会发生恐慌:

Line 45: - regexp: Compile(`^.*(?=.{7,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).*$`): error parsing regexp: invalid or unsupported Perl syntax: `(?=` 

这个正则表达式适用于Javascript和Ruby,但不适用于Go。我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

来自文档:

  

接受的正则表达式的语法与Perl,Python和其他语言使用的通用语法相同。更确切地说,它是RE2接受的语法,并在http://code.google.com/p/re2/wiki/Syntax中描述,除了\ C。

RE2维基明确指出:

  文本匹配之前

(?= re)重新(不支持)

另见:

编辑如果确实需要PCRE功能,您可以使用绑定包,例如: https://github.com/tuxychandru/golang-pkg-pcre/。否则,请尝试重新考虑您的正则表达式以及它应该匹配的内容。

答案 1 :(得分:5)

Golang的Regexp语法与PCRE(PHP / javascript大部分用)不同。

来自https://code.google.com/p/re2/wiki/Syntax

  在文本匹配之前

(?=re)重新(不支持)

//修改

在没有RE的情况下检查密码的示例:

var ErrInvalidPassword = errors.New(`The password should at least have 7 letters, at least 1 number, at least 1 upper case, at least 1 special character.`)

func VerifyPassword(pw string) error {
    if len(pw) < 10 {
        return ErrInvalidPassword
    }
    var num, lower, upper, spec bool
    for _, r := range pw {
        switch {
        case unicode.IsDigit(r):
            num = true
        case unicode.IsUpper(r):
            upper = true
        case unicode.IsLower(r):
            lower = true
        case unicode.IsSymbol(r), unicode.IsPunct(r):
            spec = true
        }
    }
    if num && lower && upper && spec {
        return nil
    }
    return ErrInvalidPassword
}

playground