2011-10-26 87 views
0

我見過幾個關於如何檢索和刪除分隔符之間的字符串的例子。但是,我創建了一個非常簡單的測試用例,並根據各種示例獲取了錯誤的輸出。爲什麼我找回要用作搜索源的字符串而不是我正在搜索的字符串?意外的正則表達式結果

String temp = "56.0 F (13.3C)"; 
String exp = "((^))"; 
String p = temp.replace(exp, ""); 
System.out.println("p=" + p); 

我得到字符串56.0F (13.3C)作爲我的輸出。

我期待得到56.0F回來。

我也嘗試過使用模式匹配:

Pattern pattern = Pattern.compile(exp); 
Matcher matcher = pattern.matcher(temp); 
if (matcher.find()) { 
    System.out.println(matcher.groupCount()); 
    for (int i=0; i<=matcher.groupCount(); i++) { 
     String groupStr = matcher.group(i); 
     System.out.println(groupStr); 
    } 
} 

2是什麼打印到控制檯

任何想法,我做錯了嗎?我一直在看這個幾個小時。謝謝!

回答

2

它返回的字符串,因爲它不能做任何替換。

嘗試使用\(.*?\)\([^)]*\)來匹配包含圓括號的字符串部分。

如果您希望它可以選擇吃掉周圍的空白,可以在正則表達式的任意一邊輸入\s*,或者對結果進行修剪。

+0

感謝亞歷克斯,現在完美的工作(除了我必須在左右括號之前使用\\轉義序列:\\(。*?\\)。 –

0

您的第一個示例打印原始字符串,因爲replace()方法不執行正則表達式替換。它試圖替換字符串((^)),這當然不存在。

但是,如果您使用了replaceAll()replaceFirst(),您將得到相同的結果。你的正則表達式中的^是一個零寬度斷言;它不會消耗任何字符,它只是將匹配錨定到字符串的開頭。我希望從你的第二個例子,看看結果是

> 56.0F (13.3C) 
> 
> 

換句話說,整個字符串(group(0))和兩個空字符串(group(1)group(2))。這是因爲這兩組人都被解釋爲捕獲組。如果你想匹配(文字)括號內的內容,你可以使用:

String exp = "\\(.*?\\)"; 

...甚至更好:

String exp = "\\([^()]*\\)"; 

沒有必要在所有使用捕獲組。