2010-09-10 64 views
3

我想提取所有大括號括起來,所以我有這樣如何使用正則表達式來提取大括號中的單詞?

foo {bar} moo {mar} 

匹配可以有任意數量的這些詞串的表情,但我開始覺得我以錯誤的方式處理這個問題。

我嘗試

而且我想提取的話牙套成團,所以我可以用每一個比賽。所以,我做了一個正則表達式:

String rx = ".*\\{({GROUP}\\w+)\\}.*"; 

注:我使用JRegex語法,所以我需要轉義一些curlies。

結果

結果我得到的是一個單一的(雖然是正確的)比賽bar,而我希望兩場比賽barmar。我誤解了什麼,如何糾正?我可能需要爲.部分使用一些其他量詞,但我希望你也可以幫助我。

非常感謝提前!

+0

可以大括號嵌套? – MAK 2010-09-10 21:07:53

回答

5

你的正則表達式.*\{({GROUP}\w+)\}.*不起作用,因爲它所有的輸入字符串匹配一個時間:

  • .*比賽foo
  • \{({GROUP}\w+)\}比賽{bar}
  • .*比賽moo {mar}

你應該使用這樣的東西:

List<String> matchList = new ArrayList<String>(); 

Pattern regex = Pattern.compile("\\{([^}]*)\\}"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) 
{ 
    matchList.add(regexMatcher.group()); 
} 

內的大括號不會被這個表達式

+3

「(?<= \\ {)([^}] *)(?= \\})」正則表達式應該給你沒有大括號的單詞。 – ScArcher2 2010-09-10 13:36:49

+0

太好了,解決了! – Nubsis 2010-09-10 13:53:24

2

一個變體處理,使用不願意修改 「*?」在正則表達式中。你可以找到一個正則表達式的搜索策略其它附加信息,(貪婪,不願意,佔有慾強)在這裏:http://javascript.about.com/library/blre09.htm

List<String> matchList = new ArrayList<String>(); 

Pattern regex = Pattern.compile("\\{(.*?)\\}"); 
Matcher regexMatcher = regex.matcher(subjectString); 
while (regexMatcher.find()) { 
    matchList.add(regexMatcher.group()); 
} 

語法選擇是你的。這個正則表達式與@ madgnome的有相同的比例。 Personnaly,我更喜歡使用不情願的搜索,而不是一個字符排除...

+0

謝謝,這是很好的閱讀。乾杯! – Nubsis 2010-09-10 13:52:31