我想从这样的字符串中提取特定信息:
String content = "ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)";
我想使用正则表达式才能仅提取:
Name1 Name2 Name3
但我不能成功。这是我的代码:
private static final String OBJECT_VALUE = "ObjectValue";
String content = "ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)";
String patternString = OBJECT_VALUE+"\\((.+)\\)";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(content);
if(matcher.find()) {
for (int i = 0; i < matcher.groupCount(); i++) {
Log.d("Found items", matcher.group(i));
}
}
这是输出:
Found items: ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)
所以,首先,我想只提取名字,而且我在正则表达式中显然遗漏了一些东西。其次,我想要该组的不同元素,而在输出中,该组由单个元素组成,是否可能?
提前谢谢!
答案 0 :(得分:1)
您需要使用非贪婪的正则表达式和使用while
来仅获取第1组值:
String content = "ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)";
String patternString = OBJECT_VALUE+"\\(([^()]+)\\)";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(content);
while(matcher.find()) {
Log.d("Found item:", matcher.group(1));
}
模式细节:
\\(
- 文字(
([^()]+)
- 第1组匹配除(
和)
以外的1 +字符(使用matcher.group(1)
访问的字符)\\)
- 文字)
请注意,if
已变为while
,因为我们知道所需的值在第1组中,所以无需循环matcher.groupCount()
。
答案 1 :(得分:1)
详细说明Wiktor的答案,这里有两个问题。
第一个是,对于输入字符串"ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)"
和模式ObjectValue\((.+)\)
,.+
可以匹配"Name1) ObjectValue(Name2) ObjectValue(Name3"
。
第二个是matcher.group(0)
表现得有些奇怪。来自文档:
组零表示整个模式,因此表达式m.group(0)等效于m.group()