使用Java中的正则表达式进行奇怪的密码检查匹配

时间:2014-09-19 15:39:07

标签: java regex symbols

我正在尝试使用以下约束检查密码:

  • 至少9个字符
  • 至少1个大写
  • 至少1个小写
  • 以下列表中至少有1个特殊字符:
    ~ ! @ # $ % ^ & * ( ) _ - + = { } [ ] | : ; " ' < > , . ?
  • 没有突出的字母

这是我写的代码:

Pattern pattern = Pattern.compile(
        "(?!.*[âêôûÄéÆÇàèÊùÌÍÎÏÐîÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ€£])"
        + "(?=.*\\d)"
        + "(?=.*[a-z])"
        + "(?=.*[A-Z])"
        + "(?=.*[`~!@#$%^&*()_\\-+={}\\[\\]\\\\|:;\"'<>,.?/])"
        + ".{9,}");

Matcher matcher = pattern.matcher(myNewPassword);

if (matcher.matches()) { 
    //do what you've got to do when you
}

问题是某些字符(例如£)不会使密码错误。

我不明白为什么这样做是因为我明确地从授权列表中排除了£

2 个答案:

答案 0 :(得分:0)

而不是试图禁止那些非ascii字符,为什么不让你的正则表达式只接受这样的ASCII字符:

Pattern pattern = Pattern.compile(
   "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*\\p{Print})\\p{ASCII}{9,})");

另请参阅使用\p{Print}而不是大字符类。我相信这对你来说已足够了。

Check Javadoc for more details

答案 1 :(得分:0)

这只允许可打印的Ascii。请注意,它允许使用空格字符,但您可以通过设置\x21来禁用空格。

编辑 - 我没有看到要求中的数字,在正则表达式中看到了,但不确定。

 # "^(?=.*[A-Z])(?=.*[a-z])(?=.*[`~!@#$%^&*()_\\-+={}\\[\\]|:;\"'<>,.?])[\\x20-\\x7E]{9,}$"

 ^ 
 (?= .* [A-Z] )
 (?= .* [a-z] )
 (?= .* [`~!@#$%^&*()_\-+={}\[\]|:;"'<>,.?] )
 [\x20-\x7E]{9,} 
 $