【问题标题】:Regex Java optional characters正则表达式 Java 可选字符
【发布时间】:2019-07-22 13:57:13
【问题描述】:

我有一个这个正则表达式;

("(?=.*[a-z]).*") ("(?=.*[0-9]).*") ("(?=.*[A-Z]).*") ("(?=.*[!@#$%&*()_+=|<>?{}\\[\\]~-]).*")

检查具有要求的密码: 长度 = 8,然后是以下三个 - 小写,大写,数字,特殊字符。 以上 4 中的 3 + 长度为 8 为必填项。

在密码中有空格之前,我的工作正常,然后它会打印错误消息。 换句话说,我如何在我的特殊字符列表中包含空格,谢谢!

【问题讨论】:

  • 你真的需要在一个正则表达式中做到这一点吗?通过多次检查,代码将更清晰。在此用例中,性能不太可能成为问题。写起来难,以后的同事读起来就更难了。
  • 我的意思是,它应该至少包含三个(小写字母、大写字母、数字、特殊字符)。我使用了多个检查,但是当有空格时它会返回错误
  • 您正在尝试检查您发现难以用正则表达式表达的内容:考虑一下。
  • 你说的特殊字符是什么意思? 它坏了是什么意思?
  • 特殊字符是指非数字和数字。我的意思是,密码可能有效,但程序打印无效,我特别有这个空间,如果你知道这个,请告诉我,谢谢

标签: java regex string passwords


【解决方案1】:

你可以试试这个:

String password = "pA55w$rd";

int counter = 0;

if(password.length() >= 8)
{
    Pattern pat = Pattern.compile(".*[a-z].*"); // Lowercase
    Matcher m = pat.matcher(password);
    if(m.find()) counter++;
    pat = Pattern.compile(".*[0-9].*"); // Digit
    m = pat.matcher(password);
    if(m.find()) counter++;
    pat = Pattern.compile(".*[A-Z].*"); // Uppercase
    m = pat.matcher(password);
    if(m.find()) counter++;
    pat = Pattern.compile(".*\\W.*"); // Special Character
    m = pat.matcher(password);
    if(m.find()) counter++;

    if(counter == 3 || counter == 4)
    {
        System.out.println("VALID PASSWORD!");
    }
    else
    {
        System.out.println("INVALID PASSWORD!");
    }
}
else
{
    System.out.println("INVALID PASSWORD!");
}

有两种情况:要么匹配所需的长度,要么不匹配。

如果它确实匹配长度,它会检查 4 种情况中的每一种,并在每次匹配时增加一个计数器。既然你希望它匹配 3 或 4 个案例,我在那边放了一个 if-else 案例。

【讨论】:

  • Mob,感谢您的代码。它运行良好,直到测试引擎进入 1234_67a。这应该是有效的,但代码打印无效,我认为特殊字符的一些事情,请调查一下。顺便说一句,计数的东西,我发现我很聪明,我是 java 新手,没有想到那种方法。
  • @RoiboisTx: \W 不包括被视为“单词”字符的_。将其替换为[^a-zA-Z0-9]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
相关资源
最近更新 更多