密码策略正则表达式

时间:2014-08-11 21:00:18

标签: regex validation

我已经看过很多关于密码策略的正则表达式,但它们似乎都不适合我。首先,这是我的要求:

  1. 最少8个字符
  2. 最多40个字符
  3. 至少一个号码
  4. 我尝试了几种不同的表达方式(见下文),除了#2之外,它们都能满足我的所有要求。似乎无论如何,我永远无法获得实际验证最大长度的正则表达式。以下是我尝试过的两个表达方式:

    1. ^.*(?=.{8,40})(?=.*\d).*$
    2. (?=.{8,40})(?=.*[0-9]).*
    3. 非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。有很多方法可以做到这一点..

 ^(?=.{8,40}$).*\d.*$

答案 1 :(得分:0)

根据您的要求,您可以使用此正则表达式:

^(?=.*?\d).{8,40}$

答案 2 :(得分:0)

为什么你的无表达式不起作用

  

(?= {8,40})(?= [0-9])。

这不起作用,因为表达式不是锚定。想一想:

.{8,40}

将匹配字符串中至少包含8个字符的任何位置,并且 more 超过40个字符只会阻止引擎继续匹配而不会导致表达式失败。

要拥有至少8个字符,但不超过40个字符,您需要将表达式锚定在字符串的开头和结尾。根据您的正则表达式引擎,以下一个(或两个)应该可以匹配有效长度,尽管语义略有不同:

  • ^.{8,40}$
  • \A.{8,40}\z

使用多个表达式简化

寻找“一个正则规则来统治所有人”使得生活变得复杂,这是没有充分理由的。除非您有明显的性能原因,否则最好运行多个检查,无论是否有正则表达式。例如,在Ruby中:

def valid_password? str
  return false if str.size < 8 or str.size > 40 or str !~ /\d/
  true
end

valid_password? 'abcd1234'
#=> true

valid_password? 'abc'
#=> false

valid_password? 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
#=> false