我创建了一个正则表达式
^(?=.*[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&)
发布于 2016-06-18 17:46:00
我的理解是,您希望确认字符串按任何顺序包含:
这里有几种方法。
在排序之后使用正则表达式
代码
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 https://stackoverflow.com/questions/37898034
复制相似问题