我正在使用以下代码编写用于密码验证的正则表达式:
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。我在这里做错了什么?
答案 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
}