我想从源代码文件中单独检索所有函数定义。最终,我想要检索所有函数名称。源文件具有以下形式:
#include bla
first_function_name()
{
}
second_function_name(first_parameter, second_parameter)
{
i = 0;
}
请注意,没有访问修饰符和返回类型,这是 NOT 用于解析Java编程语言。
我想通过regular expression实施解决方案。到目前为止,我设法匹配函数定义,但是我遇到的问题是正则表达式不仅匹配单个函数,而且还匹配之后的函数。基本上,它不会在闭合支架处结束。我尝试使用$
符号,但它也没有结束正则表达式。
我目前使用的正则表达式如下所示:
private static final String FUNCTION_NAME_MATCHER = "[a-zA-Z]\\w*";
private static final String FUNCTION_MATCHER = "(?s)" + FUNCTION_NAME_MATCHER + "[(].*[)].*[\\{]([^\\}]*)?[\\}]";
如何阻止它匹配以下功能?对于上面的示例函数,它应匹配两次,但它只匹配一次(两个函数定义一次)。
获取匹配函数定义列表的方法如下所示:
public List<String> getMatches()
{
List<String> matchedResults = new ArrayList<>();
Matcher matcher = Pattern.compile(FUNCTION_MATCHER).matcher(sourceFile);
while (matcher.find())
{
String functionDefinition = matcher.group();
String functionName = functionDefinition.split(FUNCTION_NAME_MATCHER)[0];
matchedResults.add(functionName);
}
return matchedResults;
}
答案 0 :(得分:1)
试试这个
private static final String FUNCTION_NAME_MATCHER = "([a-zA-Z]\\w*)";
private static final String FUNCTION_MATCHER = "(?s)" + FUNCTION_NAME_MATCHER + "\\([^)]*\\)\\s*\\{[^}]*\\}";
public static List<String> getMatches()
{
List<String> matchedResults = new ArrayList<>();
Matcher matcher = Pattern.compile(FUNCTION_MATCHER).matcher(sourceFile);
while (matcher.find())
{
matchedResults.add(matcher.group(1));
}
return matchedResults;
}
答案 1 :(得分:1)
*
贪婪,它会选择它可以找到的每个可能的匹配字符。现在,[(].*[)]
部分正在消耗从第一个函数中的第一个(
开始一直到第二个中的最后一个)
的所有内容。你想让它变得不情愿,如果它需要,它只会消耗一个角色。通过将所有.*
更改为.*?
此外,您可能只想匹配函数声明和正文之间的空格,因此您应该将[)].*[\\{]
替换为[)]\\s*[\\{]
如果您将FUNCTION_NAME_MATCHER
以及(
和)
的参数括起来,它将被捕获到捕获组中,以便您可以将其解压缩。
答案 2 :(得分:1)
首先,您希望匹配整个功能,以避免匹配功能调用&amp;重复:
[^\s]*\(([^}]*)\)\{([^}]*)}
然后,您想要将其拆分以获取名称:
String matchedName = matchedFunction.split("(")[0]
你去吧!它已经完成并且已经粉碎了!