You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java正则匹配C文件自定义方法名及参数的优化方案咨询

解决C文件自定义函数名与参数提取问题(排除库函数)

首先,你当前的核心问题是正则会误匹配函数调用(比如printf、scanf这类库函数),而我们真正需要捕获的是自定义函数的定义。C语言里自定义函数的定义有明确的结构:返回类型 + 函数名 + (参数列表),库函数只会在代码里被调用,不会出现在定义环节,所以我们可以通过匹配函数定义的结构来自然排除库函数,不用逐个列举排除。

优化后的正则思路

我们需要精准匹配以返回类型开头(支持基本类型、指针类型),后续跟着函数名和参数列表的行:

  • 匹配行首可能的空白字符:^\\s*
  • 匹配返回类型:覆盖常见基本类型(void/int/char等),同时支持指针写法(比如int*或int *):(?:void|int|char|float|double|long|short|unsigned|signed)\\s*(?:\\*?\\s*)
  • 捕获函数名:([\\w]+)
  • 匹配并捕获参数列表:\\s*\\((.*?)\\)

最终Java转义后的正则表达式:

String regex = "^\\s*(?:void|int|char|float|double|long|short|unsigned|signed)\\s*(?:\\*?\\s*)([\\w]+)\\s*\\((.*?)\\)";

修改后的Java代码

下面是调整后的代码,既能提取函数名,又能捕获对应参数列表,且只匹配自定义函数定义:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Deneme {
    public static void main(String[] args) {
        File f = new File("C:\\Users\\Emre\\Documents\\NetBeansProjects\\deneme\\src\\deneme\\Program.c");
        String regex = "^\\s*(?:void|int|char|float|double|long|short|unsigned|signed)\\s*(?:\\*?\\s*)([\\w]+)\\s*\\((.*?)\\)";
        Pattern funcPattern = Pattern.compile(regex);

        try (BufferedReader br = new BufferedReader(new FileReader(f))) {
            String s;
            while ((s = br.readLine()) != null) {
                Matcher m = funcPattern.matcher(s);
                if (m.find()) {
                    String funcName = m.group(1);
                    String params = m.group(2).trim();
                    // 处理无参数的情况(比如main())
                    params = params.isEmpty() ? "无参数" : params;
                    System.out.printf("函数名:%s,参数:%s%n", funcName, params);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

代码说明

  1. 资源自动管理:使用try-with-resources语法自动关闭BufferedReader,避免手动关闭遗漏导致的资源泄漏。
  2. 精准匹配逻辑:只匹配行首的函数定义,自然跳过函数调用(比如printf(...)不是以返回类型开头)。
  3. 参数友好处理:捕获参数列表后去除首尾空白,无参数时显示“无参数”,输出更直观。

测试结果

针对你提供的C文件,运行后会输出:

函数名:DiziYazdir,参数:int *p,int uzunluk
函数名:DiziTopla,参数:int *p,int uzunluk
函数名:main,参数:无参数

扩展说明

如果你的代码里存在多行函数定义(比如返回类型换行、参数列表换行),这个正则可能无法匹配,这时可以开启正则的多行模式,或者先把多行内容合并后再处理。不过对于大多数单行定义的场景,上面的方案已经足够解决你的问题。

内容的提问来源于stack exchange,提问作者Emre Ozuslu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:11:42