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

Java正则表达式:提取函数名,java,regex,capturing-group,Java,Regex,Capturing Group,我试图从公式中提取函数名列表,但我的正则表达式不起作用 给定(aaa(111)+bbb(222))/ccc(333)我需要获得一个包含aaa、bbb和ccc的字符串数组。相反,我得到的是aaa()、bbb(和ccc()。如何使这项功能发挥作用 这是我的尝试: String formula = "( aaa(111) + bbb(222) ) / ccc ( 333 )"; Pattern pattern = Pattern.compile("((\\w+)\\s*\\()");

我试图从公式中提取函数名列表,但我的正则表达式不起作用

给定
(aaa(111)+bbb(222))/ccc(333)
我需要获得一个包含
aaa
bbb
ccc
的字符串数组。相反,我得到的是
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));
    }

如果有嵌套的捕获组,请将第一个组设为非捕获组:

Pattern pattern = Pattern.compile("(?:(\\w+)\\s*\\()");
或者正如刚才所指出的,只需移除外部组:

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

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

  • 外圆括号
  • \\w+
因为你只对第二个感兴趣,你应该

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

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

请注意,
matcher.group(0)
始终是整个模式的匹配项(因此相当于此处的外括号)

看起来您需要一个解析器。您尚未指定确切的规则,但正则表达式的功能通常不足以做到这一点。您应该从匹配项中选择group(2)