2012-11-01 55 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) 
相关问题