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

IntelliJ IDEA版权配置中Velocity模板的语法及匹配函数问题

IntelliJ IDEA 版权注释自动更新模板优化

IntelliJ IDEA的「Update Copyright」功能能自动维护代码里的版权注释,但官方文档少得可怜,只覆盖了最基础的场景。尤其是${originalComment.match()}这个JetBrains自定义的Velocity函数,官方示例推测的参数逻辑(正则、捕获组序号、后缀)实际测试根本不成立,得自己摸索正确用法才能满足复杂需求。

用户需求场景

  • 新文件直接生成:Copyright (c) 2024-2024
  • 单旧年份注释更新:Copyright (c) 1970 → Copyright (c) 1970-2024
  • 旧年份范围更新:Copyright (c) 1970-1971 → Copyright (c) 1970-2024
  • 当前单年份更新:Copyright (c) 2024 → Copyright (c) 2024-2024
  • 当前年份范围保持:Copyright (c) 2024-2024 更新时不改动

当前模板问题

用户目前使用的模板:

Copyright (c) My Company ${originalComment.match("Copyright \([Cc]\) .+ (\d{4})(?:\-\d{4})?", 1, "-")}${today.year}.

存在两个核心问题:

  1. 新文件中会直接显示未解析的${originalComment.match(...)}占位符,没有处理无原有注释的场景
  2. 无法正确处理当前单年份(如2024)的更新逻辑

正确的Velocity模板写法

Copyright (c) 
#if($originalComment.isEmpty())
    ${today.year}-${today.year}
#else
    #set($matches = $originalComment.match("Copyright \(c\) (\d{4})(?:-(\d{4}))?"))
    #if($matches && $matches.size() >= 2)
        #set($startYear = $matches.get(1))
        #set($endYear = $matches.get(2))
        #if($endYear == $today.year)
            ${startYear}-${endYear}
        #else
            ${startYear}-${today.year}
        #end
    #else
        ${today.year}-${today.year}
    #end
#end

模板逻辑说明

  1. 新文件处理:通过$originalComment.isEmpty()判断是否为新文件,直接生成当前年份-当前年份
  2. 原有注释匹配:用正则Copyright \(c\) (\d{4})(?:-(\d{4}))?捕获起始年份(分组1)和可选的结束年份(分组2)
  3. 更新逻辑:
    • 如果原有结束年份已经是当前年,保持原格式不变(满足需求5)
    • 其他所有情况(单旧年份、旧年份范围、当前单年份),统一更新为起始年份-当前年份(覆盖需求2、3、4)
  4. 容错处理:如果原有注释格式不匹配正则, fallback到新文件的版权格式

内容的提问来源于stack exchange,提问作者Андрей Щеглов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:19:52