首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用正则表达式Ruby的密码策略

使用正则表达式Ruby的密码策略
EN

Stack Overflow用户
提问于 2016-06-18 14:25:15
回答 1查看 680关注 0票数 0

我创建了一个正则表达式

代码语言:javascript
复制
^(?=.*[a-z]{2})(?=.*[A-Z]{2})(?=.*\d{2})(?=.*([%]{2})).{8,10}$

这有助于我限制2小写+2大写+2 Digit+特殊字符,总长度应在8-10之间。例:a 12%将是一个有效的字符串。但是,我需要使aAaA%3%3也是一个有效的字符串.如何在红宝石中做前瞻匹配的负值

期望:字符串应该包含大写、小写、数字和特定的特殊字符的确切数量,而不管它们的order.It是什么顺序,uppercase和小写都可以。

例:2大写,2小写,2位,+特殊字符(a1b%b2&)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-18 17:46:00

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

  • 2个小写字母
  • 2个大写字母
  • 2位数
  • 1(指明)“特殊”性质和
  • 在1到3个额外字符之间(可以包括字母、数字和特殊字符)

这里有几种方法。

在排序之后使用正则表达式

代码

代码语言:javascript
复制
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

示例

代码语言:javascript
复制
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 

计数字符

代码

代码语言:javascript
复制
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 

示例

代码语言:javascript
复制
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 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37898034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档