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

Ruby on rails 非序列数据的正则表达式密码验证,ruby-on-rails,regex,validation,model,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, "mus

我正在尝试验证我的密码是否不包含任何连续字符,如“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

这可能有点超出了正则表达式的范围。我建议研究一下,它也被移植到了,甚至作为一个整体存在。这将为您提供更可靠的验证。你也可以考虑仅仅检查这些项目的代码,以获得灵感,如果你决心从零开始学习如何实现这样的事情。

< P>我同意这不是一个正则表达式的工作:也许你可以做,但会很复杂。我会这样做的

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码。我们只关心a-z和0-9之间相邻的ascii码,这就是为什么我还要将第一个字符与a-y(不是z)和0-8(不是9)进行匹配。

您可以使用下面的正则表达式,它将接受至少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,}

我怀疑这是正则表达式的任务。你需要为此编写特殊的检查。绝大多数括号只会损害执行速度和可读性,而不会提供任何值。