我正在编译一个正则表达式模式来匹配调试控制台中的特定命令,其中之一是:
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/