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

时间:2015-02-23 00:28:56

标签: java regex passwords pattern-matching

对于密码字段,我有一个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");
    }

我在这里期待一场比赛,但是失败了。 同样,其他正则表达式模式也会失败。

1 个答案:

答案 0 :(得分:3)

通过环顾(?=condition),我们可以检查整个字符串上的许多条件,因为它是零宽度(它将重置正则表达式引擎中光标的位置,以便在通过预测进行测试之前将其置于正确的位置)。

因为matches()检查整个字符串是否与正则表达式匹配,并且环顾重置光标,这意味着光标无法传递整个字符串以接受此正则表达式。

如果您想使用matches(),可以像这样使用正则表达式

(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).{3,5}

.{3,5}部分将允许正则表达式引擎迭代超过3-5个字符,因此如果字符串更短或更长,则不会被接受(因为正则表达式无法匹配整个字符串)。

此解决方案的替代方法是使用find()代替matches()。在这种情况下,你也不应该使用环视。简单的[A-Z][a-z]\\dfind()应该没问题。只有当我们希望regex能够多次迭代数据时,我们才使用环视机制。