java - 匹配(基本)函数声明

标签 java regex

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

#include bla

first_function_name()
{
}

second_function_name(first_parameter, second_parameter)
{
    i = 0;
}

请注意,没有访问修饰符和返回类型,这用于解析 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;
}

最佳答案

试试这个

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

关于java - 匹配(基本)函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35321985/

相关文章:

java - Java 中的异常

javascript - 如何捕获带有可选数量的字母/数字后跟可选逗号的组?

c# - 如何访问正则表达式语句中的变量? C# 4.0

javascript - 正则表达式不适用于 Firefox,但适用于 Chrome

sql - 在 MS SQL 中用单个逗号替换多个逗号

java - 保持游戏中运行总数的最佳方法

java - Eclipse 远程系统资源管理器 : create Java project

java - IntelliJ 无法识别 CallableStatement 字符串中的架构名称

java - 如何循环下移字母

JavaScript 特殊字符的误解