我试图用regexp编写密码验证函数,但不知道如何实现。
Go语言的标准API提供的regex包不同于其他语言。
有人知道,这个regexp模式应该是什么样子的?
模式应验证:
/*
* Password rules:
* at least 7 letters
* at least 1 number
* at least 1 upper case
* at least 1 special character
*/发布于 2014-09-14 19:46:30
正确的方法是..。这里没有雷杰普。
您可以定义一个自定义函数来验证密码,并将其与帮助验证字段的其他框架(如mccoyst/验证 (在本关于参数验证的探讨中提到)结合起来)。
您还可以使用go-验证器/验证器来定义类似的验证(但我仍然使用自定义验证器,而不是一个或多个regexp)。
注意:去雷杰普基于re2,这是一个高效、有原则的正则表达式库)。
因此,主要的权衡是,不反向引用,,例如:
(abc)\1和,没有匹配的查找-后面的。 作为交换,您可以获得高速正则表达式。
发布于 2014-09-15 02:43:33
这实际上是不可能的,因为Go的regex不支持回溯。
但是,它很容易实现,这是一个简单的例子:
func verifyPassword(s string) (sevenOrMore, number, upper, special bool) {
letters := 0
for _, c := range s {
switch {
case unicode.IsNumber(c):
number = true
case unicode.IsUpper(c):
upper = true
letters++
case unicode.IsPunct(c) || unicode.IsSymbol(c):
special = true
case unicode.IsLetter(c) || c == ' ':
letters++
default:
//return false, false, false, false
}
}
sevenOrMore = letters >= 7
return
}发布于 2019-05-14 22:30:34
根据邻近的答案,我也编写了一个对我很好的帮助函数。这一个只是假定总的密码长度是令人满意的。看看下面的..。
func isValid(s string) bool {
var (
hasMinLen = false
hasUpper = false
hasLower = false
hasNumber = false
hasSpecial = false
)
if len(s) >= 7 {
hasMinLen = true
}
for _, char := range s {
switch {
case unicode.IsUpper(char):
hasUpper = true
case unicode.IsLower(char):
hasLower = true
case unicode.IsNumber(char):
hasNumber = true
case unicode.IsPunct(char) || unicode.IsSymbol(char):
hasSpecial = true
}
}
return hasMinLen && hasUpper && hasLower && hasNumber && hasSpecial
}isValid("pass") // false
isValid("password") // false
isValid("Password") // false
isValid("P@ssword") // false
isValid("P@ssw0rd") // truehttps://stackoverflow.com/questions/25837241
复制相似问题