正则表达式 in JAVA 制作密码

Regular Expression in JAVA in making a password

我有一个问题。我的目标是做一个密码;密码必须由两个小写字母和 0-9 中的 8 位数字组成。我已经使用正则表达式为此编写了一个代码,但问题是它超过了密码必须是 10 的总数,但我这里的代码实际上并不匹配。

这是我的代码:

System.out.print("Password: ");
        Scanner pass=new Scanner(System.in);
        String password=pass.next();
        String password_regex="(?=.*[0-9])(?=.*[a-z])(?=\S+$).{8,}";
        boolean password_result=password.matches(password_regex);
        
        if(password_result){

您可以仅在数字之间断言 2 个小写字符 a-z,然后匹配 10 次 a-z 或一个数字。

^(?=\d*[a-z]\d*[a-z]\d*$)[a-z\d]{10}$

模式匹配:

  • ^ 字符串开头
  • (?=\d*[a-z]\d*[a-z]\d*$) 正面前瞻,在可选数字之间断言 2 个字符 a-z
  • [a-z\d]{10} 重复 10 次匹配字符 a-z 或数字
  • $ 字符串结束

Regex demo

在 Java 中使用双转义反斜杠

String regex = "^(?=\d*[a-z]\d*[a-z]\d*$)[a-z\d]{10}$";

正则表达式重量级且难以阅读。高度复杂的程序容易出错——编译器无法捕捉到的错误。您现在可能理解了正则表达式,但是当您在六个月后回过头来看代码时您会理解吗?其他人会看懂吗?

除非您有特定要求只使用一个正则表达式进行整个检查,否则有比正则表达式更好的选择。您可以自己查看字符:

boolean hasTwoLetters =
    (password.codePoints().filter(Character::isLetter).count() == 2);
boolean hasEightDigits =
    (password.codePoints().filter(Character::isDigit).count() == 8);

boolean passwordValid = hasTwoLetters && hasEightDigits;

仅仅因为它看起来比单个正则表达式匹配更长并不意味着它会花费更长的时间。正则表达式引擎是复杂的库,内部包含大量代码。这种方法一次只查看一个密码字符并计算它们。

有关详细信息,请参阅: