匹配 Android 中的正则表达式

Matching regular expressions in Android

我想从这样的字符串中提取特定信息:

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));
}

this Java demo

图案详情:

  • \( - 文字 (
  • ([^()]+) - 第 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)行为有点奇怪。来自文档:

Group zero denotes the entire pattern, so the expression m.group(0) is equivalent to m.group()