对于密码字段,我有一个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");
}
我在这里期待一场比赛,但是失败了。 同样,其他正则表达式模式也会失败。
答案 0 :(得分:3)
通过环顾(?=condition)
,我们可以检查整个字符串上的许多条件,因为它是零宽度(它将重置正则表达式引擎中光标的位置,以便在通过预测进行测试之前将其置于正确的位置)。
因为matches()
检查整个字符串是否与正则表达式匹配,并且环顾重置光标,这意味着光标无法传递整个字符串以接受此正则表达式。
如果您想使用matches()
,可以像这样使用正则表达式
(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).{3,5}
.{3,5}
部分将允许正则表达式引擎迭代超过3-5个字符,因此如果字符串更短或更长,则不会被接受(因为正则表达式无法匹配整个字符串)。
此解决方案的替代方法是使用find()
代替matches()
。在这种情况下,你也不应该使用环视。简单的[A-Z]
,[a-z]
,\\d
和find()
应该没问题。只有当我们希望regex能够多次迭代数据时,我们才使用环视机制。