匹配(基本)函数声明

时间:2016-02-10 17:29:45

标签: java regex

我想从源代码文件中单独检索所有函数定义。最终,我想要检索所有函数名称。源文件具有以下形式:

#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;
}

3 个答案:

答案 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]

你去吧!它已经完成并且已经粉碎了!