密码验证,一次一个正则表达式模式

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]\dfind() 应该没问题。只有当我们希望正则表达式能够多次迭代数据时,我们才使用环视机制。