2012-11-01 54 views
3

使用Java,我想提取美元符號$之間的字。

例如:

String = " this is first attribute $color$. this is the second attribute $size$" 

我想拔弦:colorsize並把它們放到一個列表。

我曾嘗試:

Pattern pattern = Pattern.compile("(\\$) .* (\\$)"); 
Matcher matcher = pattern.matcher(sentence); 

,但我得到的輸出:

"$color$.this is the second attribute $size$" 

什麼是做到這一點的最好方法是什麼?

回答

1

的問題是,你正在使用的正則表達式是貪婪和消耗在第一$開始,直到在字符串中的最後一個$一切。你有*後添加?,使正則表達式nongreedy:

Pattern pattern = Pattern.compile("\\$(.*?)\\$"); 
Matcher matcher = pattern.matcher(sentence); 
List<String> result = new ArrayList<String>(); 
for(int i=1; i <= matcher.groupCount(); i++) 
    result.add(matcher.group(i); 
+0

謝謝你[halex](http://stackoverflow.com/users/637284/halex),工作正常。 – rajesh

2

.*匹配任何符號的問題。所以你的模式結果在開始時是正確的,最後是美元符號。

如果美元之間的變量只是字母使用\$\w+\$

1

確保字不包含美元:(\$)[^$]*(\$)

或者,而不是貪婪,使用不情願的比賽,所有(\$) .*? (\$)

+0

你能告訴我,那些括號包含'(\ $)'的含義是什麼,這和我的答案有什麼不同? – Starx

+0

括號不是必需的。我猜OP由於語義原因將它們放在那裏。 – Cephalopod

1

嘗試這個正則表達式。它應該給予預期的。

Pattern pattern = Pattern.compile("\$(.*?)\$"); 
1

你應該在你的模式中使用nongreedy預選賽:

Pattern pattern = Pattern.compile("\\$(.*?)\\$"); 

注意星號後的問號。此外,您可以考慮使用+而不是*

1

使用非貪婪匹配,找到最小的比賽,你可以使用組沒有「$」只提取字:

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

字然後在第一組中找到:

matcher.group(1) 
相關問題