2012-08-10 23 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*$");