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

如何用Kotlin正则表达式找出代码中未使用的变量?

修正Kotlin未使用变量检测的实现问题

你的核心问题是仅用正则匹配变量定义无法区分是否被使用,所以会把used也纳入结果。要实现需求,需要分两步:提取所有定义的变量,再统计变量的引用次数,最终筛选出仅定义未使用的变量。

问题分析

  1. 原正则的变量命名规则错误:Kotlin变量名允许以下划线/字母开头,后续可跟字母、数字、下划线,原正则[A-Za-z]+[A-Za-z]无法匹配单字母变量或含数字/下划线的变量。
  2. 仅匹配变量定义,无法判断是否被引用——正则是模式匹配工具,不具备语义分析能力,必须结合统计逻辑。

修正后的代码实现

fun findUnusedVariables() {
    // 匹配val/var定义的变量,确保后面是变量声明的冒号或赋值等号
    val varDefRegex = Regex("(var|val)\\s+([A-Za-z_][A-Za-z0-9_]*)(?=\\s*([:=]))")
    // 匹配所有符合Kotlin命名规则的标识符(变量名)
    val varUseRegex = Regex("\\b([A-Za-z_][A-Za-z0-9_]*)\\b")
    
    val text = """
        fun main() {
        val unused: Int
        val used = 2
        print(used)
    }
    """.trimIndent()

    // 提取所有已定义的变量名集合
    val definedVars = varDefRegex.findAll(text)
        .map { it.groups[2]!!.value }
        .toSet()
    
    // 统计每个已定义变量的出现次数
    val varUsageCount = varUseRegex.findAll(text)
        .map { it.groupValues[1] }
        .filter { definedVars.contains(it) }
        .groupingBy { it }
        .eachCount()
    
    // 仅定义未使用的变量:出现次数为1(仅定义行出现一次)
    val unusedVars = definedVars.filter { varUsageCount[it] == 1 }
    
    println(unusedVars) // 输出 [unused]
}

关键改进点

  • 修正变量命名匹配正则,符合Kotlin语法规范。
  • 通过正向预查(?=\\s*([:=]))确保匹配的是变量定义,避免误匹配其他位置的val/var关键字。
  • 统计变量引用次数:定义行的变量算一次,若后续没有使用,次数保持为1,以此筛选未使用变量。

内容的提问来源于stack exchange,提问作者Денис Попков

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:55:16