【问题标题】:Java Regex validate String [duplicate]Java正则表达式验证字符串[重复]
【发布时间】:2020-09-16 05:35:05
【问题描述】:

Regex 上有很多类似的问题,但是我仍然对以下情况感到困惑:

import java.util.regex.Pattern;

public class PatternTest {

  public static void main(String[] args) {
    String PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,20})";
    Pattern pattern = Pattern.compile(PATTERN);

    boolean isTrue = pattern.matcher("nks#n1Kos2~([{&").matches();

    System.out.println(isTrue);
  }

}

~([{& 的字符不在 PATTERN 中,但是 matches 出现在 true。这是什么原因?

这是Java Regular Expression Testerhttps://www.freeformatter.com/java-regex-tester.html#ad-output上的链接

【问题讨论】:

  • 帮助混淆.{8,20} 匹配,是吗?限制密码字符集是不明智的。黑客猜测,组合是可行的

标签: java regex


【解决方案1】:

你的正则表达式是:

String PATTERN = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,20}";

这意味着匹配 任何长度为 8 到 20 的字符,满足前瞻中给出的所有条件。

你真正需要的是:

String PATTERN = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%])[a-zA-Z\\d@#$%]{8,20}";

[a-zA-Z\\d@#$%]{8,20} 将仅匹配 [...] 中允许的长度为 8 到 20 的字符。

【讨论】:

  • [a-zA-Z\\d@#$%] 有效,但它有点笨拙,因为它需要再次列出所有字符。
【解决方案2】:

(?=X) 模式是“零宽度正向前瞻”断言。所以他们断言在搜索字符串中找到了正则表达式而没有消耗任何它。所有这些断言都成功通过了。

.{8,20} 模式表示“匹配任何字符,只要其中有 8 到 20 个(包括)”。所以它匹配整个字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-23
    • 2016-07-30
    • 2013-02-09
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多