在一个特定的例子中,我想在字符串输入(ruby脚本)中提取函数调用,以进行一些统计(在java中)。有关输入的示例:
Math.sqrt(2-Math.hypot((3),4))-factorial(5)
我想获得一个possible
函数列表(验证不需要100%准确,并且可能包含一些额外的错误猜测):
{ Math.sqrt, Math.hypot, factorial }
List不必区分大小写,但如果存在则应包含函数类路径。
我尝试过天真的简单".*\\((.*)\\)"
,但我无法让它发挥作用。看来,我需要使用前瞻或反向引用,但我有点难过。我的问题是,我甚至可以这样做吗?
答案 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+]*("
在大多数语言中,函数以字母或下划线开头,后跟零个或多个非空格非特殊符号字符。这就是这个表达式捕获的内容。它会适用于你的例子。当然,它会返回重复项(可以是唯一的),并会在注释中找到内容,但作为一个快速而肮脏的解决方案,它应该没问题。