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

标签 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");
    }

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

最佳答案

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

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

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

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

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

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

关于java - 密码验证,一次一个正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28665217/

相关文章:

java - 索引文档

java - 这与android studio ide问题有关,更新我们的ide后

javascript - JS 正则表达式 (?<!X)A

sql - 在发送到服务器之前散列密码

java - 32 位和 64 位 JDBC 同时在 Java 中

java NaN 和 -infinity

mysql - SQL中的正则表达式检测一个或多个数字

regex - 在 Notepad++ 中查找LF(换行)

iphone - 在 iPhone 上存储用户名和密码的最佳做法是什么?

encryption - 如何设计系统以允许加密迁移?