【问题标题】:Can function calls be extracted with regex可以用正则表达式提取函数调用吗
【发布时间】:2011-10-27 22:27:59
【问题描述】:

在一个特定示例中,我想在字符串输入(ruby 脚本)中提取函数调用,以进行一些统计(在 java 中)。例如输入:

Math.sqrt(2-Math.hypot((3),4))-factorial(5)

我想获取使用的possible 函数的列表(验证不需要100% 准确,它可以包括一些额外的错误猜测):

{ Math.sqrt, Math.hypot, factorial }

列表不必区分大小写,但它应该包含函数类路径(如果存在)。

我尝试过天真简单的".*\\((.*)\\)",但我无法让它工作。看来,我需要使用前瞻或反向引用,但我有点难过。我的问题是,我什至可以这样做吗?

【问题讨论】:

  • 肯定有 Ruby 解析器在玩

标签: java regex


【解决方案1】:

。你不能不应该(见下面的编辑)这样做。

正则表达式只能匹配正则语言,但需要括号()匹配来匹配函数调用,因为函数调用中可以存在((1+ 2)*3)这样的嵌套表达式。正则表达式无法处理嵌套括号。

要详细了解正则语言和正则表达式的限制,请参阅Regular Expressions (wikipedia)

为了解决您的特定问题,您可能对以下资源感兴趣,建议导入 ruby​​ 脚本并使用reflection (wikipedia)


编辑:如果您想要的只是函数名,那么您可能会使用正则表达式。然而:

  • 还有其他问题案例。例如,如果调用成员函数,您会怎么做?构造函数?
  • 如果您想要抓取更多信息(例如传入的参数),您将不得不放弃您的项目并重新开始。

【讨论】:

    【解决方案2】:

    对于您的示例,模式:

    (?:\\w+\\.)?\\w+(?=\\()
    

    给出你想要的结果,但我敢肯定它不会是完美的。如果你想要一个快速但粗略的结果,那可能就是它了!

    【讨论】:

      【解决方案3】:

      您可以尝试,但您会遇到许多问题,即尝试使用本不应该这样做的工具来解析复杂的语法。由于状态和以前的标记总是在编程语言中导入,因此您需要覆盖无限的情况的数量。

      【讨论】:

        【解决方案4】:

        是的,除非您已经有语法和其他方面的经验,否则这个问题的合法解决方案会很困难。然而,一个快速而肮脏(也许不完美)的解决方案可能是可行的。

        这是我的想法...我不了解 Ruby,所以我不确定我是否遗漏了什么。没有必要匹配括号...左括号“(”是唯一真正重要的,假设程序没有语法错误。您可以搜索以下字符串

        "[A-Za-z_][.A-Za-z_0-9+]*("
        

        在大多数语言中,函数以字母或下划线开头,后跟零个或多个非空格非特殊符号字符。这就是这个表达式所捕捉到的。它适用于您的示例。当然,它会返回重复项(可以是唯一的)并会在 cmets 中找到东西,但作为一种快速而肮脏的解决方案,它应该没问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-28
          • 2021-03-29
          • 2012-12-13
          • 1970-01-01
          • 1970-01-01
          • 2015-03-21
          • 2013-06-06
          相关资源
          最近更新 更多