java中用于生成密码的正则表达式

rsl1atfo  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(313)

我有个问题。我的目标是做一个密码;密码必须由两个小写字母和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){
hec6srdp

hec6srdp1#

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

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

模式匹配: ^ 字符串开头 (?=\d*[a-z]\d*[a-z]\d*$) 正向前瞻,在可选数字之间Assert2个字符a-z [a-z\d]{10} 重复10次匹配字符a-z或数字 $ 结束
正则表达式演示
在java中使用双转义反斜杠

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

kmpatx3s2#

正则表达式很重,很难阅读。高度复杂的代码容易出现编译器无法捕捉到的错误。现在您可能已经理解了正则表达式,但六个月后再回到代码中,您会理解它吗?其他人会理解吗?
除非您有一个特定的要求,只使用一个正则表达式进行整个检查,否则有比正则表达式更好的选择。您可以检查字符本身:

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

boolean passwordValid = hasTwoLetters && hasEightDigits;

仅仅因为它看起来比单个正则表达式匹配要长并不意味着它需要更长的时间。正则表达式引擎是包含大量代码的复杂库。这种方法一次只查看一个密码字符,然后对它们进行计数。
有关详细信息,请参阅:
string.codepoints()的文档
intstream.filter的文档

相关问题