使用Python实现Java代码高亮时正则匹配注释异常问题求助
Java语法高亮功能实现修复方案
原有代码问题
- 注释内容重复:先将整行所有内容加入结果列表,又额外将匹配到的注释内容追加到列表末尾,导致同一段注释出现两次
- 处理优先级错误:没有优先处理注释,注释内部内容可能被错误识别为关键词,且按空格拆分单词的逻辑会破坏连续的注释结构
- 正则匹配规则不完整:无法正确匹配带前导空格的完整注释块,也没有覆盖多行注释的场景
修复后完整代码
import re # 提前定义Java关键词列表,可根据需要补充 keywords = {"public", "class", "static", "void", "int", "String", "if", "else", "for", "while", "return"} # 匹配单行块注释(含前导空格)的正则,也支持后续调整为跨多行注释匹配 comment_regex = re.compile(r'(\s*\/\*[\s\S]*?\*\/)') def print_html(): """输出带高亮标签的HTML内容""" text = txt_edit.get(1.0, tk.END) new_text = [] for line in text.split("\n"): line_parts = [] # 先按注释拆分整行内容,拆分结果为[非注释段, 注释段, 非注释段, ...]的结构 segments = comment_regex.split(line) for seg in segments: # 如果当前段是注释,直接加comment标签 if comment_regex.fullmatch(seg): line_parts.append(f'<span class="comment">{seg}</span>') continue # 非注释段处理关键词:按空格拆分,匹配到关键词加标签 word_list = [] for word in seg.split(" "): if word in keywords: word_list.append(f'<span class="keyword">{word}</span>') else: word_list.append(word) line_parts.append(" ".join(word_list)) # 拼接当前行所有片段 new_text.append("".join(line_parts)) final_html = "\n".join(new_text) print(final_html)
修复逻辑说明
- 优先处理注释:使用正则将注释作为整体匹配拆分,注释内容直接套
<span class="comment">标签,不会再处理内部的字符,避免错误识别关键词 - 无重复追加:直接对拆分后的片段做替换处理,所有内容只出现一次,解决注释重复的问题
- 正则优化:匹配注释时包含前导空格,符合预期输出中注释前的空格也被包裹在comment标签内的要求,
[\s\S]*?可以匹配任意字符包括换行,后续需要支持多行注释时也无需大幅修改正则
内容的提问来源于stack exchange,提问作者Evan Gertis
相关产品推荐
相关产品推荐

