在Android中匹配正则表达式

时间:2017-07-20 17:54:53

标签: java android regex design-patterns matcher

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

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)

所以,首先,我想只提取名字,而且我在正则表达式中显然遗漏了一些东西。其次,我想要该组的不同元素,而在输出中,该组由单个元素组成,是否可能?

提前谢谢!

2 个答案:

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

请参阅this Java demo

模式细节

  • \\( - 文字(
  • ([^()]+) - 第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()