【问题标题】:Password policy using regular expression Ruby使用正则表达式 Ruby 的密码策略
【发布时间】:2016-10-20 06:19:41
【问题描述】:

我已经创建了一个正则表达式

^(?=.*[a-z]{2})(?=.*[A-Z]{2})(?=.*\d{2})(?=.*([%]{2})).{8,10}$

这有助于我限制 2 个小写 + 2 个大写 + 2 个数字+ 特殊字符,并且 tge 总长度应该在 8-10 之间。 例如:aaAA12%% 将是一个有效的字符串。但是,我需要使 aAaA%3%3 也是一个有效的字符串。 如何在 ruby​​ 中进行前瞻匹配的否定

期望:字符串应包含大小写、小写、数字和特定特殊字符的确切数量,无论它们的顺序如何。它可以是任何顺序,后跟大写和小写。

例如:2个大写,2个小写,2个数字,+特殊字符(aA1B%b2&)

【问题讨论】:

  • 这是否必须在单个正则表达式中实现?对于这种情况,这样做看起来非常困难,而简单地计算多个表达式中每个类别中的匹配项将非常容易。顺便说一句,我希望这是一个练习,而不是实际的密码策略!

标签: ruby-on-rails ruby regex passwords


【解决方案1】:

我的理解是您希望确认一个字符串包含,以任何顺序:

  • 2 个小写字母
  • 2 个大写字母
  • 2 位数
  • 1(指定)“特殊”字符和
  • 1 到 3 个附加字符(可能包括字母、数字和特殊字符)

这里有几种方法。

排序后使用正则表达式

代码

def confirm(str, special)
  r = /
      [A-Z]{2,}   # match at least 2 uppercase letters
      [a-z]{2,}   # match at least 2 lowercase letters
      \d{2,}      # match at least 2 digits
      #{special}  # match the special character
      /x          # free-spacing regex definition mode
  str.size.between?(8,10) && str.each_char.sort_by do |c|
    case c
    when /[A-Z]/ then 0
    when /[a-z]/ then 1
    when /\d+/   then 2
    when special then 3
    else              4
    end
  end.join =~ r ? true : false 
end

例子

confirm("aaAA12%%",    "%") #=> true 
confirm("aAaA%3%3",    "%") #=> true 
confirm("2aAaA%3%3",   "%") #=> true 
confirm("2aA1bA%A%3",  "%") #=> true 
confirm("2aA1bA%4%3",  "%") #=> true 
confirm("aAaaA%3a%3",  "%") #=> true 
confirm("2aAaA%3%3",   "%") #=> true 
confirm("aaA12%4%",    "%") #=> false
confirm("aAA12%4%",    "%") #=> false
confirm("aaAA1%aa%",   "%") #=> false 
confirm("2aA1b4A%3%3", "%") #=> false 
confirm("aA1bA%3",     "%") #=> false 

计算字符数

代码

def confirm(str, special)
  str.size.between?(8,10) && str.scan(/[A-Z]/).size >= 2 &&
    str.scan(/[a-z]/).size >= 2 && str.scan(/\d/).size >= 2 &&
    str.count(special) >= 1
end 

例子

confirm("aaAA12%%",    "%") #=> true 
confirm("aAaA%3%3",    "%") #=> true 
confirm("2aAaA%3%3",   "%") #=> true 
confirm("2aA1bA%A%3",  "%") #=> true 
confirm("2aA1bA%4%3",  "%") #=> true 
confirm("aAaaA%3a%3",  "%") #=> true 
confirm("2aAaA%3%3",   "%") #=> true 
confirm("aaA12%4%",    "%") #=> false
confirm("aAA12%4%",    "%") #=> false
confirm("aaAA1%aa%",   "%") #=> false 
confirm("2aA1b4A%3%3", "%") #=> false 
confirm("aA1bA%3",     "%") #=> false 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2018-08-20
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 2010-11-18
    相关资源
    最近更新 更多