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
}
它仅适用于typemethod1(“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还有其他方法吗?是的。更正:您可以提取方法名,但不能通过正则表达式进行验证。请参阅我的答案。这甚至对typea(“key”)
函数都不起作用。@Kaplan您能给出一个不起作用的字符串示例吗?在方法调用下,我理解一个带有要传递的可选参数的方法的名称。因此,您只需要方法名:a(
而不是a(“key”)
@Kaplan这正是正则表达式所做的。请查看提供的示例(regex101和Ideone)。方法名(仅,不带参数)被提取,正如问题中所述。