使用Java,我想提取dollarign符号$
之间的单词。
例如:
String = " this is first attribute $color$. this is the second attribute $size$"
我想提取字符串:color
和size
并将它们放入列表中。
我试过了:
Pattern pattern = Pattern.compile("(\\$) .* (\\$)");
Matcher matcher = pattern.matcher(sentence);
但是我得到了输出:
"$color$.this is the second attribute $size$"
这样做的最佳方式是什么?
答案 0 :(得分:2)
.*
匹配任何符号的问题。因此,您的模式结果在开始时是正确的,最后是美元符号。
如果您的美元之间的变量只是字母数字,请使用\$\w+\$
答案 1 :(得分:1)
确保该字不包含美元:(\$)[^$]*(\$)
或者,而不是贪婪,使用不情愿的匹配 - 所有(\$) .*? (\$)
答案 2 :(得分:1)
试试这个正则表达式。它应该给出预期的结果。
Pattern pattern = Pattern.compile("\$(.*?)\$");
答案 3 :(得分:1)
问题是你正在使用的正则表达式是贪婪的,并且消耗从字符串中的第一个$
开始直到最后$
的所有内容。您必须在?
之后添加*
以使正则表达式不正确:
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);
答案 4 :(得分:1)
你应该在你的模式中使用非贪婪的限定符:
Pattern pattern = Pattern.compile("\\$(.*?)\\$");
注意星号后面的问号。另外,您可以考虑使用+
代替*
。
答案 5 :(得分:1)
使用非贪婪匹配来查找最小匹配,您可以使用组仅提取不带“$”的单词:
"\\$(.*?)\\$"
然后在第一组中找到该词:
matcher.group(1)