密码验证,一次一个正则表达式模式
Password validation, one regex pattern at a time
对于密码字段,我有一个 TextWatcher 和 onTextChanged,我 运行 针对文本的四种正则表达式模式中的每一种,一次一个。我的正则表达式模式是:
".{3,5}"
"(?=.*[A-Z])"
"(?=.*[a-z])"
"(?=.*\d)"
我写了这个测试代码,不明白为什么会失败:
Pattern pat = Pattern.compile("(?=.*[A-Z])");
Matcher mat = pat.matcher("aB");
if(mat.matches()){
System.out.println("MATCHES!");
}
else{
System.out.println("DOES NOT MATCH");
}
我希望这里有一场比赛,但它失败了。
同样,其他正则表达式模式也会失败。
通过环视 (?=condition)
我们可以检查整个字符串的许多条件,因为它是零宽度的(它将在正则表达式引擎中重置光标的位置,以放置在 look 执行测试之前的正确位置-提前)。
因此,由于 matches()
检查整个字符串是否与正则表达式匹配,并且环视重置游标,这意味着游标无法传递整个字符串以接受此正则表达式。
如果你想使用 matches()
你可以像这样使用正则表达式
(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{3,5}
.{3,5}
部分将允许正则表达式引擎迭代 3-5 个字符,因此如果字符串更短或更长,它将不被接受(因为正则表达式无法匹配整个字符串)。
此解决方案的替代方法是使用 find()
而不是 matches()
。同样在这种情况下,您不应该使用环顾四周。简单的 [A-Z]
、[a-z]
、\d
和 find()
应该没问题。只有当我们希望正则表达式能够多次迭代数据时,我们才使用环视机制。
对于密码字段,我有一个 TextWatcher 和 onTextChanged,我 运行 针对文本的四种正则表达式模式中的每一种,一次一个。我的正则表达式模式是:
".{3,5}"
"(?=.*[A-Z])"
"(?=.*[a-z])"
"(?=.*\d)"
我写了这个测试代码,不明白为什么会失败:
Pattern pat = Pattern.compile("(?=.*[A-Z])");
Matcher mat = pat.matcher("aB");
if(mat.matches()){
System.out.println("MATCHES!");
}
else{
System.out.println("DOES NOT MATCH");
}
我希望这里有一场比赛,但它失败了。 同样,其他正则表达式模式也会失败。
通过环视 (?=condition)
我们可以检查整个字符串的许多条件,因为它是零宽度的(它将在正则表达式引擎中重置光标的位置,以放置在 look 执行测试之前的正确位置-提前)。
因此,由于 matches()
检查整个字符串是否与正则表达式匹配,并且环视重置游标,这意味着游标无法传递整个字符串以接受此正则表达式。
如果你想使用 matches()
你可以像这样使用正则表达式
(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{3,5}
.{3,5}
部分将允许正则表达式引擎迭代 3-5 个字符,因此如果字符串更短或更长,它将不被接受(因为正则表达式无法匹配整个字符串)。
此解决方案的替代方法是使用 find()
而不是 matches()
。同样在这种情况下,您不应该使用环顾四周。简单的 [A-Z]
、[a-z]
、\d
和 find()
应该没问题。只有当我们希望正则表达式能够多次迭代数据时,我们才使用环视机制。