Java正则表达式:提取函数名称

时间:2015-04-28 23:14:27

标签: java regex capturing-group

我正在尝试从公式中提取函数名列表,但我的正则表达式无效。

鉴于( aaa(111) + bbb(222) ) / ccc ( 333 )我需要获取包含aaabbbccc的字符串数组。相反,我得到aaa(bbb(ccc (。如何使这项工作?

这是我的尝试:

    String formula = "( aaa(111) + bbb(222) ) / ccc ( 333 )";
    Pattern pattern = Pattern.compile("((\\w+)\\s*\\()");
    Matcher matcher = pattern.matcher(formula);

    while(matcher.find()){
        System.out.println(matcher.group(1));
    }

2 个答案:

答案 0 :(得分:2)

您的模式中有2个捕获组:

  • 外部括号
  • \\w+
  • 周围的人

由于你只对第二个感兴趣,你应该

  • 选择第二组:matcher.group(2)
  • 删除外部括号:

    Pattern pattern = Pattern.compile("(\\w+)\\s*\\(");
    

请注意,matcher.group(0)始终是整个模式的匹配(因此与您的外部括号相同)

答案 1 :(得分:0)

您已经拥有嵌套捕获组,使第一个成为非捕获组:

Pattern pattern = Pattern.compile("(?:(\\w+)\\s*\\()");

Didier L所指出的只是删除外部组:

Pattern pattern = Pattern.compile("((\\w+)\\s*\\(");