我试图验证我的密码可能不包含任何连续字符,例如" 123"或" abcd"我是regex的新手,我试图通过在我的用户模型中使用以下代码来实现这一目标:
validate :password_complexity
def password_complexity
if password.present? and not password.match(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d). /)
errors.add :password, "must include at least one lowercase letter, one uppercase letter, and one digit"
end
end
答案 0 :(得分:1)
这可能有点超出了正则表达式的范围。我建议您查看zxcvbn,该a ruby gem of the same name也已移植到a devise plugin,甚至存在jsfiddle。这将为您提供更强大的验证。如果你决定学习如何从头开始实现这样的东西,你也可以考虑只检查这些项目的代码,寻找灵感。
答案 1 :(得分:1)
我同意这不是正则表达式的工作:也许你可以做到,但它会非常复杂。我就是这样做的。
def contains_sequential_characters?(string)
sequential = false
string.split("").each_with_index do |char,i|
if (string[i+1] == string[i]+1) && char =~ /[a-y0-8]/i
sequential = true
end
end
sequential
end
此解决方案的核心是在字符串上调用数组索引(例如"foo"[2]
)将为您提供该位置的字符的ascii代码。我们只关心az和0-9之间彼此相邻的ascii代码,这就是为什么我也将第一个字符与ay(不是z)和0-8(不是9)相匹配的原因)。
答案 2 :(得分:0)
您可以使用下面的正则表达式,它将接受至少13位数字,并且不接受连续数字或连续字符:
(?=.*?[0-9])(?!.*((12)|(23)|(34)|(45)|(56)|(67)|(78)|(90)|(01)))(?=.*?[a-zäöüß])(?!.*((ab)|(bc)|(cd)|(ef)|(fg)|(gh)|(hi)|(ij)|(jk)|(kl)|(lm)|(mn)|(no)|(op)|(pq)|(qr)|(rs)|(st)|(tu)|(uv)|(vw)|(wx)|(xy)|(yz)))(?=.*?[A-ZÄÖÜ])(?!.*((AB)|(BC)|(CD)|(EF)|(FG)|(GH)|(HI)|(IJ)|(JK)|(KL)|(LM)|(MN)|(NO)|(OP)|(PQ)|(QR)|(RS)|(ST)|(TU)|(UV)|(VW)|(WX)|(xy)|(yz))).{13,}