【问题标题】:password validation and UNICODE密码验证和 UNICODE
【发布时间】:2013-03-02 05:57:57
【问题描述】:

如何验证正则表达式的条件: 密码不得包含紧跟相同字符序列的任何字符序列。我也有其他情况,正在使用

(?=.*(..+)\\1)

验证立即序列重复。它正在失败。这段代码对传递的第 3 个和第 4 个字符串返回“true”;我需要它返回false。请帮忙。

String s2[] = {"1newAb", "newAB1", "1234567AaAa", "123456ab3434", "love", "love1"}; 
    boolean b3;
    for(int i=0; i<s2.length; i++){
        b3 = s2[i].matches("^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*(..+)\\1).{5,12}$");
        System.out.println("value" + b3);
    }

【问题讨论】:

  • 学习使用正则表达式大师的秘密武器——在线测试工具! -> regexplanet.com/advanced/index.html(谷歌“正则表达式测试器”以获得更多选项)。
  • 为什么需要为此使用正则表达式?
  • 虽然这可能是学习正则表达式的好练习,但您最好将每个规则的密码检查分开并仅在需要时使用正则表达式,以提高代码的维护性和可读性

标签: java regex passwords pattern-matching


【解决方案1】:

你可以试试negative look-ahead(?!.*(.{2,})\\1)

对于那些想知道\\1 是什么的人:它代表来自第 1 组的匹配,在我们的例子中是来自(.{2,}) 的匹配

【讨论】:

  • 我实际上需要任何序列(但我的初始代码一次尝试 2 个字符)。我试过这个,它也不适用于 2 个字符。我已将此添加到我的代码中,但失败了;它为“ADOALDO”返回 false 这是我的模式。 b3 = s2[i].matches("^(?=.*[0-9])(?=.*[a-zA-Z])(?!.*(.{2,})\\1 ).{5,12}$");
  • @user1769790 您的模式似乎为 ADOALDO 返回 false,因为它不包含任何数字
  • 你是对的我现在检查了;这是我的错。谢谢你。我将按照规则分解代码;我正在考虑为每个正则表达式拆分显示错误消息。我也在添加 UNICODE,并且您的正则表达式也适用于 UNICODE。谢谢!
  • @user1769790 很高兴我能帮上忙 :)
【解决方案2】:

根据 Ron 的建议,我发现 java 中的哪些方法有帮助; match()、find() 的工作方式不同。 find() 帮助了我。 Guido 的建议是分解不同规则的代码。这是我的代码;尚未完善:使用 (\S+?)\1

检查任何序列的重复
String regex = "(\\S+?)\\1";
        String regex2 = "^(?=.*[0-9])(?=.*[a-zA-Z]).{5,12}$";
        p = Pattern.compile(regex);
        for (String str : s2) {
            matcher = p.matcher(str);
           if (matcher.find())
              System.out.println(str + " got repeated: " + matcher.group(1));
           else if(str.matches(regex2))
               System.out.println(str + " Password correct");
           else
               System.out.println(str + " Password incorrect");

        }

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多