2012-07-06 49 views
1

我使用java和一个正则表达式。正则表达式的密码

我做了密码验证一个正则表达式:

String PASSWORD_PATTERN_ADVANCED = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+]).{8,20}$"; 

或没有额外的斜线:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°"\]\[²³*/+]).{8,20}$ 

whuch手段(我可能是错的):至少一个数字/至少一个小写/至少一个大写字母/至少一个特殊字符/最小总长度为8,最大长度为20 ...

做了一个测试用例,为成功生成密码失败...

成功 - > OK,全部通过 失败 - >几乎OK ......

失败失败的唯一密码:d是在它的空间的像:

iF\ !h6 2A3|Gm 
¨I O7 gZ2%L£k vd~39 
2< A Uw a7kEw6,6S^ 
cC2c5N# 
6L kIw~ Béj7]5 
ynRZ #44ç 
9A `sè53Laj A 
s²R[µ3 9UrR q8n 

我很困惑。

任何想法,使其工作?

感谢

+0

以防万一..你检查过http://stackoverflow.com/q/3200292/1007273? – hovanessyan 2012-07-06 14:40:58

+0

@hovanessyan好!这里是直接链接[link](http://code.google.com/p/vt-middleware/wiki/vtpassword)。我一定会在未来的开发中使用它。 – 2012-07-09 14:13:57

回答

1

正则表达式可能不是这里工作的正确工具。

正则表达式最适合匹配模式;你所描述的本质上不是一种模式,它更像是一个规则集。当然,你可以创建一些有用的正则表达式,但这是一个非常复杂和不透明的代码,这使得维护成为一个挑战。

像这样的方法可能是更好的选择:

public boolean isValidPassword(String password) { 
    boolean containsLowerCase; 
    boolean containsUpperCase; 
    boolean containsInvalid; 
    boolean containsSpecialChar; 
    boolean containsDigit; 

    for(char c: password.toCharArray()) { 
     containsLowerCase ||= Character.isLowerCase(c); 
     containsUpperCase ||= Character.isUpperCase(c); 
     containsDigit  ||= Character.isDigit(c); 
     containsSpecialChar ||= someMethodForDetectingIfItIsSpecial(c); 

    } 

    return containsLowerCase && 
      containsUpperCase && 
      containsSpecialChar && 
      containsDigit && 
      !containsInvalid && 
      password.length >=8 && password.length <=20; 

} 

你需要决定检出特殊字符(specialCharArray.contains(c),正则表达式等)的最佳方法。

但是,这种方法会使添加新规则变得简单得多。

+0

我跟随的好建议。非常感谢。 – 2012-07-09 14:14:40

0

没有你的条件,说明什么不能是密码,只有什么必须。您还需要一个条件来组合所有可能的有效字符,并确保密码中的所有字符都在该列表中(即最终条件为(\d|[a-z]|[A-Z]|@#$...){8,20})。要么是被拒绝的字符列表。

1

我可能是错的,但是如果你根本不想使用空格,那么在你的lookahead中使用[^\\s]而不是.

String PASSWORD_PATTERN_ADVANCED = 
     "^(?=[^\\s]*\\d)" 
     + "(?=[^\\s]*[a-z])" 
     + "(?=[^\\s]*[A-Z])" 
     + "(?=[^\\s]*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+])" 
     + ".{8,20}$";