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

Python实现提取Java代码中类及指定函数大括号内的完整代码

解决方案

问题原因

原有正则方案失效的核心原因是.*?非贪婪匹配规则只会匹配到第一个遇到的}字符,完全无法处理Java代码中普遍存在的嵌套大括号场景,同时正则本身也不是处理这种嵌套结构化内容的最优工具。

下面提供两种可行实现方案:

方案1:原生Python栈匹配(无第三方依赖)

通过栈计数匹配大括号的嵌套层级,轻量高效,适合简单场景使用:

def extract_java_content(code: str, target_name: str, target_type: str = "class") -> str:
    # 构造匹配目标开头的正则
    if target_type == "class":
        pattern = rf'class\s+{target_name}\s*{{'
    elif target_type == "method":
        # 匹配方法签名:忽略修饰符、返回值,直接匹配方法名加参数括号
        pattern = rf'{target_name}\s*\([^)]*\)\s*{{'
    else:
        raise ValueError("target_type only support 'class' or 'method'")
    
    import re
    # 定位目标起始位置
    match = re.search(pattern, code, re.DOTALL)
    if not match:
        return ""
    start_idx = match.end() - 1  # 定位到第一个{的下标
    stack = 0
    end_idx = len(code)
    # 遍历匹配嵌套括号
    for i in range(start_idx, len(code)):
        if code[i] == "{":
            stack += 1
        elif code[i] == "}":
            stack -= 1
            if stack == 0:
                end_idx = i
                break
    # 提取大括号内部内容,strip可按需保留或删除
    return code[start_idx+1 : end_idx].strip()

# 测试调用
if __name__ == "__main__":
    with open("MergeSort.java", "r", encoding="utf-8") as f:
        java_code = f.read()
    # 提取类内容
    class_content = extract_java_content(java_code, "MergeSort", "class")
    print("=== MergeSort类内部代码 ===")
    print(class_content)
    # 提取printArray方法内容
    method_content = extract_java_content(java_code, "printArray", "method")
    print("\n=== printArray函数内部代码 ===")
    print(method_content)

方案2:基于Java语法解析库javalang(稳定可靠)

如果需要处理注释、字符串内包含大括号等复杂场景,推荐使用专门的Java语法解析库,避免手动匹配的边界问题:

  1. 先安装依赖:
pip install javalang
  1. 实现代码:
import javalang

def extract_by_javalang(code: str, target_name: str, target_type: str = "class") -> str:
    tree = javalang.parse.parse(code)
    lines = code.splitlines(keepends=True)
    if target_type == "class":
        # 遍历查找目标类
        for path, cls in tree.filter(javalang.tree.ClassDeclaration):
            if cls.name == target_name:
                start_line = cls.position.line - 1
                end_line = cls.end_position.line - 1
                # 跳过首行的{,提取内部内容
                content = "".join(lines[start_line+1 : end_line]).strip()
                return content
    elif target_type == "method":
        # 遍历查找目标方法
        for path, method in tree.filter(javalang.tree.MethodDeclaration):
            if method.name == target_name:
                start_line = method.position.line - 1
                end_line = method.end_position.line - 1
                content = "".join(lines[start_line+1 : end_line]).strip()
                return content
    return ""

# 测试调用
if __name__ == "__main__":
    with open("MergeSort.java", "r", encoding="utf-8") as f:
        java_code = f.read()
    print("=== MergeSort类内部代码 ===")
    print(extract_by_javalang(java_code, "MergeSort", "class"))
    print("\n=== printArray函数内部代码 ===")
    print(extract_by_javalang(java_code, "printArray", "method"))

内容的提问来源于stack exchange,提问作者shaishav maisuria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:15:02