2011-07-08 33 views
1

行,所以我有心理障碍,当谈到正则表达式 - 但有人告诉我,拿出一个正则表达式,它满足以下条件:强密码的正则表达式

  • 必须至少8个字符(简单! )
  • 必须具有来自4个不同的字符类型的至少3个字符 - 大写,小写,数字,符号(OK)
  • 必须具有至少5个不同的字符
  • 不能具有的长序列相同的字符类型(例如asdnme​​会被认为是不好的,因为它是l的一个长序列奥尔情况下)
(?=^.{8,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9\s])(?=.*[a-z])|(?=.*[^A-Za-z0-9\s])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9\s])) 

这正则表达式满足1和2。但我在努力寻找实例3和4

如果任何正则表达式爱好者可以帮助我 - 我们将不胜感激。 :)

注:我不想使用正则表达式 - 这是我问任何人是否有可能使用正则表达式检查第3和第4种情况?请不要因为正则表达式是唯一的解决方案而信任我。我不相信 - 我们的achitect决定用最少的努力参与使用正则表达式来解决这个问题。

我个人认为这个级别的密码安全性会让系统无法使用!但也许我不在乎密码安全:)

注意:我们正在尝试使用Microsoft ASPNET成员 - 正则表达式。这就是为什么我认为它需要成为一个单一的表达。我知道,尝试阅读/理解是很可怕的。

如果任何人都可以提供单独的正则表达式的表达式 - 必须具有至少5个不同的字符 - 不能具有相同的字符类型的长序列(例如asdnme​​将被认为是不好的作为其下壳体的长序列) - 假设5个序列太长..

或者c#代码/ javascript?虽然这是特定的客户 - 我们不希望它空白应用于所有客户端。这可能是为什么架构师想要一个很好的正则表达式,您可以在部署时插入。 :(

发现别人的例子,在.NET工作

^(([AZ])(*()\ 1 {2}?!)|?([AZ])|( ?\ d)|((数字)([^ A-ZA-Z \ d])){8}((上)((下????)|((非字母数字)|?(?)) )|((数字?)((非字母数字)|?()?!)|))(?!)|((下)((数字?)((非字母数字)|?()?!)|(? !))|(?!)))$

不幸的是,满足这些条件:

  • 必须有8个字符的最小长度

  • 必须包含三个以下四个类型的字符:

  • 英文大写字母(A - Z)

  • 英文小写字母(a - z)

  • 数值数字(0 - 9)

  • 非字母数字字符

  • 没有字符可以成一排,例如重复3次或更多次BB(字母B两次)OK,但BBB(字母B三次)不正确。

但没有检测到至少5个不同的字符用于:(

没关系 - 下面的答案似乎工作唯一的事情是,它似乎允许4个不同的字符,而不是要求。 ?5

我已经调整了它是: ^((= {8,}?):???(= \ d)(= [AZ])(= [ (φ=。 \ d)(?=。[^ A-Za-z0-9 \ s])(?=。 [az])| 10 [^ A-Za-z0-9 \ s])(?=。 (?=。[AZ])(?=。 [^ A-Za-z0-9 \ s])(?=。[az])|(?=。 \ d) )(?=(。)(?>。?(?!\ 1})(。))(?>。?(?!\ 1} | \ 2)(。))(?>。? (?!\ 1 | \ 2 | \ 3)(。))(?>。?(?!\ 1 | \ 2 | \ 3 | \ 4)(。))(?>。?(?! (?!。?\ d {4})(?!。?[az] {4})(?!。?[1 | \ 2 | \ 3 | \ 4 | \ 5)。) AZ] {4})(?!。*?[^ A-Za-z0-9 \ s] {4})

希望我们再也不要碰它了)再次我会推代码选项,我认为:)

编辑:发现字符串不太正确。它不会传递“!tt23yyy”而不必添加其他数字或特殊字符。所以有正则表达式的想法,并与代码选项。这实在太难调试正则表达式的问题,如果你不理解正则表达式:)(可以理解的)

+1

你想要将太多的东西塞进一个正则表达式中......如果你设法让所有东西都进入,那么这对任何人来说都是难以逾越的。是否有一个特定的要求,你*必须*只使用*一个*正则表达式? – rid

+0

它必须在一个通行证?如果您一次完成这项任务,您无法为用户提供很多反馈意见。 –

+1

为什么使用正则表达式呢?特别是单一的?你不能告诉用户用户破坏了你的一个奇怪的要求吗? –

回答

6

这里是一个PCRE/Perl的正则表达式,将尽一切:

/ 
^ # anchor it 

# must be at least 8 characters 
(?=.{8,}) 

# must have characters from at least 3 of the 4 different character types 
(?: 
    (?=.*\d)(?=.*[A-Z])(?=.*[a-z]) 
| (?=.*\d)(?=.*[^A-Za-z0-9\s])(?=.*[a-z]) 
| (?=.*[^A-Za-z0-9\s])(?=.*[A-Z])(?=.*[a-z]) 
| (?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9\s]) 
) 

# at least 5 different chars 
(?= 
         (.) 
    (?>.*?(?!\1})  (.)) 
    (?>.*?(?!\1}|\2)  (.)) 
    (?>.*?(?!\1|\2|\3) (.)) 
    (?>.*?(?!\1|\2|\3|\4) .) 
) 

# no long sequence of the same character type (if long is 3) 
(?!.*?\d{3}) 
(?!.*?[a-z]{3}) 
(?!.*?[A-Z]{3}) 
(?!.*?[^A-Za-z0-9\s]{3}) 

/xs 

不是测试,因此能错过了一些东西。请享用。 ;-)

如果你真的要使用它(在较长的字符串上),你可能想要添加一些(更多)原子分组(?>foo)(或类似的)来防止指数回溯。

+0

感谢您的详细回复:) – Jen

+0

也可以在开始时用'^'将其锚定,而那些'\ g {-N}'可以重写为相应的'\ N'(如果不支持,我用他们以防万一有其他捕获组)。 – Qtax

+0

最后一部分 - 注意到这些似乎没有拾取多个字母(小写或大写) - 但符号和数字都有效。即。这些语句(?!。*?[a-z] {3})(?!。*?[A-Z] {3}) – Jen