可以使用正则表达式提取函数调用

时间:2011-10-27 22:28:00

标签: java regex

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

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

我想获得一个possible函数列表(验证不需要100%准确,并且可能包含一些额外的错误猜测):

{ Math.sqrt, Math.hypot, factorial }

List不必区分大小写,但如果存在则应包含函数类路径。

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

4 个答案:

答案 0 :(得分:3)

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

正则表达式只能匹配常规语言,但匹配函数调用需要括号()匹配,因为函数调用中可能存在((1+ 2)*3)之类的嵌套表达式。正则表达式不能处理嵌套括号。

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

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


编辑:如果你想要的只是函数名,那么你可能会得到正则表达式。但是:

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

答案 1 :(得分:2)

对于您的示例,模式:

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

给出你想要的结果,但是我确定它不会是完美的。如果快速但粗略的结果是您所追求的,那可能就是它!

答案 2 :(得分:0)

您可以尝试但是您将遇到许多问题,试图使用不打算这样做的工具来解析复杂的语法。因为状态和以前的标记总是以编程语言导入,所以需要覆盖无限边缘的情况数。

答案 3 :(得分:0)

是的,除非你已经有过语法和东西的经验,否则这个问题的合法解决方案会很难。但是,快速而肮脏(可能不完美)的解决方案可能是可行的。

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

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

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