java模式正则表达式匹配

时间:2017-09-08 17:58:42

标签: java regex

模式匹配我真的很糟糕。我正在尝试输入密码并检查它是否符合此标准:

  • 包含至少1个小写字母
  • 包含至少1个大写字母
  • 包含至少1个数字
  • 至少包含其中一个特殊字符:@#$%
  • 的最小长度为8个字符
  • 的最大长度为10个字符

这就是我所拥有的:

Pattern pattern = Pattern.compile("((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,10})");

Matcher matcher = pattern.matcher(in);

if(!matcher.find())
{
  return false;
}
else
{
  return true;
}

我还想做这样的事情:

int MIN = 8,
MAX = 10;

"((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{MIN,MAX})"

但我收到一些关于格式错误表达的奇怪信息。

有些事情是对的。我的程序崩溃了。我不知道出了什么问题。有什么想法吗?

   private boolean isValidPassword(String in)
{
    /*          PASSWORD MUST:
    *   contains at least 1 lowercase letter
    *   contains at least 1 uppercase letter
    *   contains at least 1 number
    *   contains at least one of these special chars: @#$%
    *   has a minimum length of 8 characters
    *   has a maximum length of 10 characters
    */

    Pattern hasLowercase = Pattern.compile(".*[a-z].*");
    Pattern hasUppercase = Pattern.compile(".*[A-Z].*");
    Pattern hasNumber    = Pattern.compile(".*[0-9].*");
    Pattern hasSpecial   = Pattern.compile(".*(@|#|$|%).*");

    Matcher matcher = hasLowercase.matcher(in);

    if (!matcher.matches())  //a-z
    {
        return false;
    }

    matcher = hasUppercase.matcher(in);

    if (!matcher.matches())  //A-Z
    {
        return false;
    }

    matcher = hasNumber.matcher(in);

    if (!matcher.matches())  //0-9
    {
        return false;
    }

    matcher = hasSpecial.matcher(in);

    if (!matcher.matches())  //@#$%
    {
        return false;
    }

    if(in.length() < MIN_LENGTH || in.length() > MAX_LENGTH)   //length must be min-to-max.
    {
        return false;
    }

    return true;

}

3 个答案:

答案 0 :(得分:0)

如果你真的想用正则表达式来做这件事,那么针对多个简单表达式而不是单个且过于复杂的表达式测试输入会容易得多。

针对以下正则表达式测试您的输入。 如果其中一个失败,则输入无效。

.*[a-z].*
.*[A-Z].*
.*[0-9].*
.*(@|#|$|%).*

另外,使用基本的字符串方法检查输入的长度。

答案 1 :(得分:0)

我不知道如何在没有更多信息的情况下帮助您崩溃,但我确实有建议。

我不建议创建一个巨大的正则表达式,而是建议为每个规则创建一个表达式,然后单独在字符串上测试它们。如果您决定要更改/添加/删除规则,则可以轻松编辑单个规则。这也使他们更容易理解。

还可以选择不使用正则表达式,使用these character classes

的字符串包含方法可以使规则变得非常简单

对于格式错误的表达式,你应该像这样连接MIN和MAX: "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{" + MIN + "," + MAX + "})",它将MAX和MIN的值插入字符串。

答案 2 :(得分:0)

我认为你的表情可能不合适,但我找到了符合你要求的东西。 "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,10})"

您可以使用

修改最小和最大长度

"^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{" + MIN + "," + MAX + "})"

我已将此RegEx包含在Regexr中,以便您了解其工作原理。 http://regexr.com/3gnbd

此外,为了将来测试正则表达式时的参考,regexr.com对于查看不同的组件非常有帮助。

您还应该使用if / then语句返回true或false,因为您可以只返回测试条件。 return matcher.find()消除了对if语句的需要。