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语法解析库,避免手动匹配的边界问题:
- 先安装依赖:
pip install javalang
- 实现代码:
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
相关产品推荐
相关产品推荐

