【问题标题】:Password validation, one regex pattern at a time密码验证,一次一个正则表达式模式
【发布时间】:2015-04-24 06:30:15
【问题描述】:

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

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

【问题讨论】:

  • 请编辑您的问题,明确说明您的行为和期望。 (我假设你期待一场比赛但没有得到一场比赛,但我不应该猜测。)

标签: java regex passwords pattern-matching


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我需要能够分别将密码与每个正则表达式模式进行模式匹配。原因是,在我的 UI 中,我想在输入密码时显示每个规则的状态。
  • @DIUser 由于您在 Stack Overflow 上相对较新,您可能不熟悉接受应答机制。在这种情况下,请考虑查看meta.stackexchange.com/a/5235/186652
猜你喜欢
  • 2022-11-25
  • 2011-05-06
  • 2016-10-19
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多