gpt4 book ai didi

java - 正则表达式未按预期工作

转载 作者:行者123 更新时间:2023-12-01 15:23:14 25 4
gpt4 key购买 nike

我正在使用以下正则表达式。(?=.+[a-z])(?=.+[A-Z])(?=.+[^a-zA-Z]).{8,}

我的目标是拥有一个具有以下 4 个属性中的 3 个的密码

大写字符、小写字符、数字、特殊字符

我正在使用http://rubular.com/r/i26nwsTcaUhttp://regexlib.com/RETester.aspx使用以下输入测试表达式

P@55w0rd
password1P
Password1
paSSw0rd

所有这些都应该通过,但只有第二个和第四个通过 http://rubular.com/r/i26nwsTcaU所有这些都通过 http://regexlib.com/RETester.aspx .

我还有以下代码用于验证

private void doValidate(String inputStr,String regex) {
Pattern pattern = Pattern.compile(regex);
if(!pattern.matcher(inputStr).matches()){
String errMessage = "";
throw new UniquenessConstraintViolatedException(errMessage);
}
}

此代码无法验证本应通过的“Password1”。就表达方式而言,我是这样理解的

must have lower (?=.+[a-z])
must have upper (?=.+[A-Z])
must have non alpha (?=.+[^a-zA-Z])
must be eight characters long .{8,}

谁能告诉我我做错了什么。

提前致谢。

最佳答案

本质上,应该归咎于 .+ 子表达式,它们应该是 .*。否则,先行部分会查找小写、大写或非字母,但每个相应类型的字符如果是字符串中的第一个字符,则不计算在内。因此,您验证的不是密码,而是第一个字符被截断的密码。虽然 @Cfreak 是不对的,但他很接近 - 你正在做的事情用普通的正则表达式是不可能的,你必须使用他的建议。随着lookahead组 - (?=) - 可以做你需要的事情。不过,就我个人而言,我宁愿像 @Cfreak 建议的那样对其进行编码 - 它更具可读性,并且您的意图从代码中更清晰。复杂的正则表达式往往很难编写,但在一段时间后几乎不可能读取、调试或改进。

关于java - 正则表达式未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10556425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com