【问题标题】:Why does the non-capturing group change the behaviour of the regex?为什么非捕获组会改变正则表达式的行为?
【发布时间】:2012-08-10 11:01:45
【问题描述】:

我正在编译一个正则表达式模式以匹配调试控制台中的特定命令,其中之一是:

Pattern.compile("^\\s*\\\\connect\\s+((\\d{1,3}\\.){3}\\d{1,3})(?:\\s+(\\d+))?\\s*$");

所以可以进入

\connect 127.0.0.1 2345

或离开港口

\connect 127.0.0.1

只要我最后使用一个空格来分隔字段,空格就会被忽略。

它工作得很好,但是,当 ip 进入第 1 组(没问题)时,端口进入第 3 组(如我所知)。

所以我想对ip地址的前三部分使用非捕获组:

Pattern.compile("^\\s*\\\\connect\\s+((?:\\d{1,3}\\.){3}\\d{1,3})(?:\\s+(\\d+))?\\s*$");

所以我想我会得到第 1 组中的 ip 和第 2 组中的端口。 但是现在 Matcher.matches() 为相同的输入返回 false ......问题出在哪里?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    大胆猜测:问题出在其他地方。 我做了一个快速测试:

            String test = "\\connect 127.0.0.1 2345";
        Pattern p1 = Pattern.compile("^\\s*\\\\connect\\s+((\\d{1,3}\\.){3}\\d{1,3})(?:\\s+(\\d+))?\\s*$");
        Pattern p2 = Pattern.compile("^\\s*\\\\connect\\s+((?:\\d{1,3}\\.){3}\\d{1,3})(?:\\s+(\\d+))?\\s*$");
    
        System.out.println(p1.matcher(test).matches());
        System.out.println(p2.matcher(test).matches());
    

    输出: 真的 真的

    【讨论】:

    • Arrgh,它确实有效。首先,我遇到了另一个导致 Matcher 错误的问题。我与删除 ?: 一起修复了这个问题,所以它再次起作用了。然后我重试了非分组,但断点 behind matcher.group(2) 调用。它没有被击中,所以我认为它仍然无法正常工作。但问题是我忘记将包含端口的组的调用从 3 更改为 2。所以出现了异常。我看不到它,因为它在围绕 Method.invoke 调用的 try catch 构造中被捕获而没有输出,该调用调用了一个调用命令检查方法的方法。
    【解决方案2】:
    "^\\s*\\\\connect\\s+((?:\\d{1,3}\\.){3}\\d{1,3})(?:\\s+(\\d+))?\\s*$"
    

    我在 Eclipse IDE Search/Replace 中进行了尝试,它找到了 \connect 3.54.1.4 4234 字符串并很好地将 \1 替换为 ip 并将 \2 替换为端口。

    这也返回 true:

    "\\connect 3.54.1.4 4234".matches("^\\s*\\\\connect\\s+((?:\\d{1,3}\\.){3}\\d{1,3})(?:\\s+(\\d+))?\\s*$");
    

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 2011-03-31
      • 2010-09-08
      • 2018-09-08
      相关资源
      最近更新 更多