Regex 编译正则表达式时出现死机

Regex 编译正则表达式时出现死机,regex,go,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: Comp

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

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中不工作。我做错了什么?

来自文档:

接受的正则表达式的语法与Perl、Python和其他语言使用的通用语法相同。更准确地说,它是RE2接受的语法,在中描述,但\C除外

RE2维基明确指出:

文本匹配前的(?=re)re(不支持)

另见:


编辑:如果您确实需要PCRE功能,可以使用绑定包,例如。否则,请尝试重新考虑您的regexp以及它应该匹配的内容。

Golang的regexp语法与PCRE(php/javascript大部分使用PCRE)不同

发件人:

(?=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
}
var ErrInvalidPassword=errors.New(`密码应至少包含7个字母、至少1个数字、至少1个大写字母、至少1个特殊字符。`)
func验证密码(pw字符串)错误{
如果len(pw)<10{
返回ErrInvalidPassword
}
变量编号,下,上,规格布尔
对于u,r:=范围pw{
开关{
大小写unicode.IsDigit(r):
num=真
大小写unicode.IsUpper(r):
上限=真
大小写unicode.IsLower(r):
下限=真
大小写为unicode.IsSymbol(r),unicode.ispunt(r):
spec=true
}
}
如果数值和下限和上限和规格(&S){
归零
}
返回ErrInvalidPassword
}

正如错误消息所说,不支持lookahead。据我所知,Perl中的lookahead仅在正则表达式的末尾受支持。即使Javascript/ruby可能支持它。试着不要使用它们,在你想要捕捉某些东西的地方使用
()
。模式应该在func之外定义和初始化,以便只编译一次。特别适用于regexp.MustCompile,因为模式必须在启动时编译,否则会崩溃。这使得它类似于编译器错误,因此可以快速找到并修复。那么,我如何重写与golang匹配的正则表达式?也许可以添加一个示例,说明您期望的输入类型。密码应至少为7个字母、至少1个数字、至少1个大写字母、至少1个特殊字符。非常感谢。@zero_编码好吧,我还没有清醒到想清楚如何在Go的RE中实现它,但是在我看来,跳过RE要简单得多。我添加了一个示例,说明如何在不使用RE的情况下实现它。