java - 为什么非捕获组会改变正则表达式的行为?

标签 java regex

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

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...问题出在哪里?

最佳答案

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

        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());

输出: 真的 是的

关于java - 为什么非捕获组会改变正则表达式的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11900318/

相关文章:

java - 如何通过Java检测特定进程是否在Windows下运行?

javascript - 无法将带有单引号的变量附加到 anchor 标记的标题

java - 用于屏蔽电子邮件的正则表达式

java - 如何最好地访问模式中捕获组的数量?

java - 无法弄清楚为什么我得到空值

java - 如何清除 Eclipse Indigo 的缓存

java - 删除在第一个索引处停止的索引方法(java字符串数组)

regex - Django URLS,使用 ?在网址中

regex - Haskell中原始但有效的grep克隆?

javascript - 使用 Jquery 计算特定单词数