正则表达式密码要求

时间:2009-10-23 18:12:07

标签: regex

我想要求以下内容:

  • 大于七个字符。
  • 至少包含两位数字。
  • 包含至少两个特殊(非字母数字)字符。

......我想出了这个:

(?=.{6,})(?=(.*\d){2,})(?=(.*\W){2,})

现在,我还要确保没有两个连续字符是相同的。我有点时间让它工作了。这就是我自己得到的东西:

(\S)\1+

...但如果我尝试将两者结合在一起,那就失败了。


我在应用程序的限制范围内运行。它的默认要求是1个字符长度,没有正则表达式,也没有非标准字符。

无论如何......

使用this test harness,我希望y90e5 $匹配但y90e5 $ $ 则不会。

我错过了什么?

4 个答案:

答案 0 :(得分:11)

这是一个正则表达式的坏地方。你最好使用简单的验证。

答案 1 :(得分:6)

有时候我们无法影响规范并且必须编写实现,无论是什么时候,某些古老的后台系统必须通过网络进行接口但是对输入有一定的限制,或者只是因为你的老板要求你。

编辑:删除了基于提问者original regex的正则表达式。

更改原始代码以符合您的描述,因为它似乎并不真正起作用:
编辑:q。然后更新以反映另一个版本。我在下面解释了一些差异:

我的版本:两个或多个\W\d可以互相重复,但不能彼此相邻(这是我的错误假设),我修复了它的长度> 7这是一种典型的“全部抓取”表达方式,效率稍高一些。

 ^(?!.*((\S)\1|\s))(?=.*(\d.+){2,})(?=.*(\W.+){2,}).{8,}

原始问题中的新版本:允许两个或多个\W\d彼此相邻。该版本目前支持长度> = 6,而不是长度> 7,如文中所解释的。

当前的答案,更正,应该是这样的,它采用更新的q。,我对长度&gt; 7的评论和优化,然后它看起来像: ^(?!.*((\S)\1|\s))(?=(.*\d){2,})(?=(.*\W){2,}).{8,} 。< / p>

更新:您的原始代码似乎无法正常工作,所以我稍微改了一下 更新:更新了答案以反映有问题的更改,不再允许使用空格

答案 2 :(得分:1)

这可能不是最有效但似乎有效。

^(?!.*(\S)\1)(?=.{6,})(?=(.*\d){2,})(?=(.*\W){2,})

测试字符串:

  • ad2f#we1 $ //匹配有效。
  • adfwwe12#$ //没有重复比赛ww。
  • y90e5 $$ //没有匹配重复$$。
  • y90e5 $ //不匹配太短,只有1 \ W类值。

其中一条评论指出,上述正则表达式允许通常不用于密码字段的空格。虽然这似乎不是原始帖子的要求,但正如所指出的那样,简单的改变也会禁止空格。

^(?!.*(\S)\1|.*\s)(?=.{6,})(?=(.*\d){2,})(?=(.*\W){2,})

您的正则表达式引擎可能会以不同方式解析(?!.*(\S)\1|.*\s)。请注意并相应调整。

以前的所有测试结果都是一样的 用空格测试字符串:

  • ad2f#we1 $ //字符串中没有匹配空格。

答案 3 :(得分:0)

如果规则是密码必须是两位数字后跟三个字母或一些字母,或者当然正则表达式可以很好地工作。但我不认为正则表达式真的是为你实际拥有的那种规则而设计的。即使你让它发挥作用,对于那些不得不在以后维护它的可怜的傻瓜来说也是相当神秘的 - 可能是你。我认为编写一个循环遍历字符的快速函数并计算每种类型的总数和数量会更简单。然后在最后检查计数。

仅仅因为你知道如何使用正则表达式并不意味着你必须将它们用于所有事情。我有一个很酷的无绳电钻,但我不用它来装钉子。

相关问题