Android 中匹配正则表达式

问题描述 投票:0回答:2

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

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)

所以,首先,我只想提取名称,但我显然在正则表达式中遗漏了一些内容。其次,我想要该组的不同元素,而在输出中,该组由单个元素组成,这可能吗?

java android regex matcher
2个回答
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));
}

参见 这个 Java 演示

图案详情

  • \\(
    - 字面意思
    (
  • ([^()]+)
    - 第 1 组匹配除
    (
    )
    之外的 1 个以上字符(通过
    matcher.group(1)
    访问的字符)
  • \\)
    - 字面意思
    )

请注意,

if
变成了
while
,并且无需循环
matcher.groupCount()
,因为我们知道所需的值在第1组中。


1
投票

为了详细说明 Wiktor 的答案,这里有两个问题。

首先,对于输入字符串

"ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)"
和模式
ObjectValue\((.+)\)
.+
可以匹配
"Name1) ObjectValue(Name2) ObjectValue(Name3"

第二个是

matcher.group(0)
的行为有点奇怪。来自文档:

第 0 组表示整个模式,因此表达式 m.group(0) 等价于 m.group()

© www.soinside.com 2019 - 2024. All rights reserved.