2011-12-24 20 views
0

我想獲取(和)之間的東西。正則表達式使用()搜索指定組的實例

但()用於團體,並與逃生\我得到的錯誤:

Pattern p = Pattern.compile("(\(.*\))"); 

意想不到的字符: '('

我怎樣才能防止這種

Wed 13 Oct 2010 20:00:11 +0200 (CEST)

Tue 12 Oct 2010 21:27:48 +0200 (CEST)

Tue 12 Oct 2010 04:44:57 +0200 (West-Europa (zomertijd))

Tue 12 Oct 2010 03:10:22 +0200 (CEST)

Mon 11 Oct 2010 23:10:04 +0200 (CEST)

Mon 11 Oct 2010 20:56:27 +0200 (CEST)

(我用java)

回答

1

在Java中的字符串,你必須逃離'\\'字符,請嘗試:

Pattern p = Pattern.compile("(\\(.*\\))"); 
+0

謝謝,這個很好用,也是sidyll – clankill3r 2011-12-24 20:06:48

1

你需要逃避逃生:

"(\\(.*?\\))" 

請注意,我也使用了「匹配任何東西」的非貪婪版本。

雙重轉義是因爲在字符串文字中,反斜槓用於轉義序列(如\n),所以如果您想在字符串中使用反斜槓,則需要使用另一個反斜槓進行轉義。

+1

非貪婪仍然可以給你意想不到如果輸入數據不是很好(例如,'foo(bar(boo)hoo)'你會匹配'(bar(boo)') – 2011-12-24 13:43:16

2

您還需要躲避反斜線;我也想你想在不同的位置逃生(和更好的更具體的你要配什麼):

Pattern p = Pattern.compile("\\(([^()]*)\\)"); 

說明:

\\( # literal (
(  # start capturing group 
[^()]* # any number of characters except parentheses 
)  # end capturing group 
\\)  # literal) 
+0

+1此表達式在嵌套時正確匹配所有「最內層」匹配的圓括號(懶惰點星形版本失敗時,parens是nested。) – ridgerunner 2011-12-24 14:53:17

+0

這一個出錯 (西歐(zomertijd)) 但感謝解釋! – clankill3r 2011-12-24 20:05:09

+0

對。如果你總是想捕獲最外面的一對括號,並且如果在相同的嵌套級別上不會有多於一對的括號,那麼'。*'而不是'[^()] *'更好。但只有這樣。 – 2011-12-24 20:33:41