如何用Kotlin正则表达式找出代码中未使用的变量?
修正Kotlin未使用变量检测的实现问题
你的核心问题是仅用正则匹配变量定义无法区分是否被使用,所以会把used也纳入结果。要实现需求,需要分两步:提取所有定义的变量,再统计变量的引用次数,最终筛选出仅定义未使用的变量。
问题分析
- 原正则的变量命名规则错误:Kotlin变量名允许以下划线/字母开头,后续可跟字母、数字、下划线,原正则
[A-Za-z]+[A-Za-z]无法匹配单字母变量或含数字/下划线的变量。 - 仅匹配变量定义,无法判断是否被引用——正则是模式匹配工具,不具备语义分析能力,必须结合统计逻辑。
修正后的代码实现
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,提问作者Денис Попков
相关产品推荐
相关产品推荐

