【问题标题】:Java regex: extract function namesJava 正则表达式:提取函数名称
【发布时间】:2015-07-08 00:29:39
【问题描述】:

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

给定( 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));
    }

【问题讨论】:

  • 看起来你需要一个解析器。您尚未指定确切的规则,但正则表达式通常不足以执行此操作。
  • 你应该从比赛中选择 group(2)

标签: java regex capturing-group


【解决方案1】:

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

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

既然你只对第二个感兴趣,你应该要么

  • 拍第二组:matcher.group(2)
  • 去掉外括号:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多