3

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

鉴于( 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));
    }
4

2 回答 2

2

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

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

由于您只对第二个感兴趣,因此您应该

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

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

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

于 2015-04-28T23:21:34.397 回答
0

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

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

或者正如Didier L所指出的,只需删除外部组:

Pattern pattern = Pattern.compile("((\\w+)\\s*\\(");
于 2015-04-28T23:19:11.367 回答