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

使用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)

修复逻辑说明

  1. 优先处理注释:使用正则将注释作为整体匹配拆分,注释内容直接套<span class="comment">标签,不会再处理内部的字符,避免错误识别关键词
  2. 无重复追加:直接对拆分后的片段做替换处理,所有内容只出现一次,解决注释重复的问题
  3. 正则优化:匹配注释时包含前导空格,符合预期输出中注释前的空格也被包裹在comment标签内的要求,[\s\S]*?可以匹配任意字符包括换行,后续需要支持多行注释时也无需大幅修改正则

内容的提问来源于stack exchange,提问作者Evan Gertis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:09:01