非序列数据的正则表达式密码验证

时间:2015-11-20 09:05:34

标签: ruby-on-rails regex validation model

我试图验证我的密码可能不包含任何连续字符,例如" 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

3 个答案:

答案 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,}