3

使用 Java,我想提取 $ 符号之间的单词$

例如:

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$"

做这个的最好方式是什么?

4

6 回答 6

2

.*匹配任何符号的问题。因此,您的模式结果在开头是正确的,结尾是美元符号。

如果美元之间的变量只是字母数字使用\$\w+\$

于 2012-11-01T10:01:50.170 回答
1

确保单词不包含美元:(\$)[^$]*(\$)

或者,不要贪婪,而是使用不情愿的全匹配(\$) .*? (\$)

于 2012-11-01T10:02:10.117 回答
1

试试这个正则表达式。它应该给出预期的结果。

Pattern pattern = Pattern.compile("\$(.*?)\$");
于 2012-11-01T10:02:51.537 回答
1

问题是您正在使用的正则表达式是贪婪的,并且从字符串中的第一个$开始到最后一个都消耗了所有内容。$您必须在 之后添加 a?*使正则表达式不贪婪:

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);
于 2012-11-01T10:03:04.190 回答
1

您应该在模式中使用非贪婪限定符:

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

注意星号后面的问号。此外,您可以考虑使用+而不是*.

于 2012-11-01T10:03:40.070 回答
1

使用非贪婪匹配找到最小匹配,您可以使用组仅提取没有“$”的单词:

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

然后在第一组中找到该词:

matcher.group(1)
于 2012-11-01T10:04:41.730 回答