【问题标题】:Regex password validation for non-sequence data非序列数据的正则表达式密码验证
【发布时间】:2015-11-20 09:05:33
【问题描述】:

我正在尝试验证我的密码可能不包含任何连续字符,例如“123”或“abcd”等。我是正则表达式的新手,我正在尝试通过在我的用户模型:

  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

【问题讨论】:

  • 我怀疑这是正则表达式的任务。您需要为此编写特殊检查。

标签: ruby-on-rails regex validation model


【解决方案1】:

这可能有点超出了正则表达式的范围。我建议查看zxcvbn,它也已被移植到a ruby gem of the same name,甚至以a devise plugin 的形式存在。这将为您提供更强大的验证。如果您决心了解如何从头开始实现类似的东西,您也可以考虑只检查这些项目的代码以获得灵感。

【讨论】:

    【解决方案2】:

    我同意这不是正则表达式的工作:也许你可以做到,但它会非常复杂。这就是我的做法。

    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 代码,这就是为什么我还将 first 字符与 a-y(不是 z)和 0-8(不是 9 )。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 绝大多数括号只会损害执行速度和可读性,而根本没有提供任何价值。
      猜你喜欢
      • 2011-05-06
      • 2016-10-19
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多