我想从这样的字符串中提取特定信息:
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)
所以,首先,我只想提取名称,但我显然在正则表达式中遗漏了一些内容。其次,我想要该组的不同元素,而在输出中,该组由单个元素组成,这可能吗?
您需要使用非贪婪正则表达式并且使用
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));
}
参见 这个 Java 演示
图案详情:
\\(
- 字面意思 (
([^()]+)
- 第 1 组匹配除 (
和 )
之外的 1 个以上字符(通过 matcher.group(1)
访问的字符)\\)
- 字面意思 )
请注意,
if
变成了while
,并且无需循环matcher.groupCount()
,因为我们知道所需的值在第1组中。
为了详细说明 Wiktor 的答案,这里有两个问题。
首先,对于输入字符串
"ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)"
和模式ObjectValue\((.+)\)
,.+
可以匹配"Name1) ObjectValue(Name2) ObjectValue(Name3"
。
第二个是
matcher.group(0)
的行为有点奇怪。来自文档:
第 0 组表示整个模式,因此表达式 m.group(0) 等价于 m.group()