2012-08-10 24 views
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 ...问题在哪里?

回答

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

输出: 真正 真正

+0

Arrgh,它确实工作。首先,我还遇到了另一个导致匹配器错误的问题。我解决了这个问题,删除了?:所以它再次运行。然后我重试了非分组,但是用matcher.group(2)调用的断点_behind_。它没有被击中,所以我认为它仍然不起作用。但问题是我忘记将包含端口的组的呼叫从3改为2.因此出现异常。我看不到它,因为在调用一个调用命令检查方法的方法的Method.invoke调用周围的try catch结构中,它没有输出。 – jue78 2012-08-10 11:48:26

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

我试图在Eclipse IDE中查找/替换,它发现\connect 3.54.1.4 4234 String,并很好地与IP和\2与端口替换\1

这也将返回true:

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