2

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

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

4

2 回答 2

0
"^\\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*$");
于 2012-08-10T11:22:32.000 回答
0

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

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

输出:真真

于 2012-08-10T11:30:45.663 回答