【问题标题】:Matching regular expressions in AndroidAndroid中的匹配正则表达式
【发布时间】:2017-07-20 17:54:52
【问题描述】:

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

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 design-patterns matcher


    【解决方案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,没有必要循环matcher.groupCount(),因为我们知道需要的值在第1组中。

    【讨论】:

    • 我能说什么?简直太棒了!谢谢维克托。
    【解决方案2】:

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

    首先,对于输入字符串"ObjectValue(Name1) ObjectValue(Name2) ObjectValue(Name3)"和模式ObjectValue\((.+)\).+可以匹配"Name1) ObjectValue(Name2) ObjectValue(Name3"

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2011-05-01
      相关资源
      最近更新 更多