Java Regex查找任何语言中的所有方法调用

Java Regex查找任何语言中的所有方法调用,java,regex,Java,Regex,我需要一个正则表达式,它将匹配给定字符串中的所有方法调用 输入和输出示例: method1(“key”)//输出method1 method1(“key”).method2(“key”)//输出method1,method12 method1(method2.key())//输出method1,method2 我尝试了以下代码 String line = "public String = method1(\"param\")"; private static Pattern methodCall

我需要一个正则表达式,它将匹配给定字符串中的所有方法调用

输入和输出示例:

method1(“key”)//输出method1

method1(“key”).method2(“key”)//输出method1,method12

method1(method2.key())//输出method1,method2

我尝试了以下代码

String line = "public String = method1(\"param\")";
private static Pattern methodCalls = Pattern.compile("[a-zA-Z]+\\([^\\)]*\\)(\\.[^\\)]*\\))?");

Matcher mc = methodCalls.matcher(line);
while (mc.find()) {
   System.out.println(mc.group(0)); // expected method1
}
它仅适用于type
method1(“key”)
函数。

此模式查找问题中的3个方法调用示例-仅3个示例

private static Pattern methodCalls=Pattern.compile(\\w+[(](?:\“\\w+\”\\w+\.\\w+[(][)))[))](?:\.\\w+[(]\“\\w+\”[))?”

不能同时提取和验证。推理非常简单:方法调用包括dyck语言,而dyck语言不是正则的,因此无法通过正则表达式验证某些类似dyck的字符串

但如果您已经知道语法是正确的,则可以通过以下正则表达式提取所有方法名:

([^\W:.,()\s]+)\s*\(|::([^W:.,()\s]+)
注:

  • 为了便于阅读,我加入了换行符。如果将它们包含在正则表达式中,它将不起作用。请将正则表达式写在一行中
  • 如果要在Java中使用正则表达式,则需要转义
    \
    es)


有关详细说明,请参阅。

,这是不可能的。您无法通过DFA识别dyck语言,因此无法通过正则表达式获取所有(递归)方法调用。@Turing85还有其他方法吗?是的。更正:您可以提取方法名,但不能通过正则表达式进行验证。请参阅我的答案。这甚至对type
a(“key”)
函数都不起作用。@Kaplan您能给出一个不起作用的字符串示例吗?在方法调用下,我理解一个带有要传递的可选参数的方法的名称。因此,您只需要方法名:
a(
而不是
a(“key”)
@Kaplan这正是正则表达式所做的。请查看提供的示例(regex101和Ideone)。方法名(仅,不带参数)被提取,正如问题中所述。