Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java模式正则表达式匹配_Java_Regex - Fatal编程技术网

java模式正则表达式匹配

java模式正则表达式匹配,java,regex,Java,Regex,我对模式匹配很不在行。我正在尝试输入密码并检查它是否符合以下条件: 包含至少1个小写字母 至少包含1个大写字母 包含至少1个数字 至少包含其中一个特殊字符:@#$% 最小长度为8个字符 最大长度为10个字符 这就是我所拥有的: Pattern pattern = Pattern.compile("((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,10})"); int MIN = 8, MAX = 10; "((?=.*\\d)(?=.*[a

我对模式匹配很不在行。我正在尝试输入密码并检查它是否符合以下条件:

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

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

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

我也想做这样的事情:

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

}
专用布尔值isValidPassword(字符串输入)
{
/*密码必须:
*包含至少1个小写字母
*至少包含1个大写字母
*包含至少1个数字
*至少包含其中一个特殊字符:@#$%
*最小长度为8个字符
*最大长度为10个字符
*/
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);
如果(!matcher.matches())//a-z
{
返回false;
}
matcher=hassuppercase.matcher(in);
如果(!matcher.matches())//A-Z
{
返回false;
}
matcher=hasNumber.matcher(in);
如果(!matcher.matches())//0-9
{
返回false;
}
匹配器=hasSpecial.matcher(in);
如果(!matcher.matches())/@$%
{
返回false;
}
if(in.length()MAX_-length)//长度必须是最小到最大值。
{
返回false;
}
返回true;
}

如果您真的想用正则表达式来实现这一点,那么根据多个简单表达式而不是一个过于复杂的表达式来测试输入会容易得多

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

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

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

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

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

还有一个不使用regex的选项,这将使使用stringcontains方法和

对于格式不正确的表达式,应按如下方式计算最小值和最大值:
“((?=.*\\d)(?=.[a-z])(?=.[a-z])(?=.[@#$%])。{“+MIN+”,“+MAX+”})”
将在字符串中插入MAX和MIN的值。

我认为您的表达式可能已关闭,但我找到了一个符合您需要的表达式。
“^(?=.[a-z])(?=.[a-z])(?=.[0-9])(?=.[!@\$%\^&*])(?=.{8,10})”

可以使用修改最小和最大长度

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

我已经在Regexr中包含了这个正则表达式,所以您可以看到它是如何工作的。

另外,为了将来测试正则表达式时参考,查看不同的组件非常有帮助


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

正则表达式不是所有问题的答案。您还可以将规则编写为多个条件,并将它们与&&组合。这将在将来更容易理解和修改。我需要一个工作模式匹配器。为什么要限制密码长度?“但我收到一些关于格式错误表达式的奇怪消息”消息说什么?顺便说一句,看起来您在开始时有额外的
。此外,您不应该使用
find
,而应该使用
matches()
,因为您不想检查文本的某些部分是否可以由正则表达式匹配,但是正则表达式是否匹配整个文本。除此之外,
如果(条件){return true;}否则{return false;}
可以简化为
返回条件;
。尝试过了,但仍然给出了错误的格式。我只是对插入MAX和MIN的值进行了评论,我没有运行实际的正则表达式本身。如果您想调试正则表达式,我建议使用类似regex101.com的站点