如何更简便地将IntelliJ IDEA环境变量转为Tuple列表?
简便转换IntelliJ IDEA环境变量为Kotlin Tuple/Pair列表的方案
咱们先梳理下当前的核心问题:你的环境变量字符串格式是[("egg", "dairy"),("chicken", "meat"),("apple", "fruit")],这个格式接近序列化格式但并非标准规范,所以之前的split和Jackson方法才会踩坑。下面给你两个更靠谱的简便方案:
方案一:调整环境变量为标准JSON格式(最推荐)
如果可以修改环境变量的格式,把它改成标准的JSON数组格式,后续解析会非常省心:
GROCERY_LIST=[["egg", "dairy"],["chicken", "meat"],["apple", "fruit"]]
然后用Jackson直接解析成List<Pair<String, String>>,代码如下:
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.readValue val mapper = jacksonObjectMapper() val gListStr = System.getenv("GROCERY_LIST") // 先解析成List<List<String>>,再转成Pair列表 val groceryList: List<Pair<String, String>> = mapper.readValue<List<List<String>>>(gListStr) .map { it[0] to it[1] } // 遍历测试 groceryList.forEach { (item, category) -> println("物品:$item,分类:$category") }
这个方案的好处是利用成熟的JSON解析库,避免自己写正则或分割逻辑,稳定性和可读性都很强。
方案二:基于正则匹配原格式(无需修改环境变量)
如果没法改环境变量的格式,咱们可以用正则表达式直接捕获每个Tuple里的内容,比split更精准:
val gListStr = System.getenv("GROCERY_LIST") // 匹配每个("x", "y")格式的片段,捕获x和y的内容 val regex = Regex("""\("([^"]+)",\s*"([^"]+)"\)""") val groceryList: List<Pair<String, String>> = regex.findAll(gListStr) .map { matchResult -> matchResult.groupValues[1] to matchResult.groupValues[2] } .toList() // 遍历测试 groceryList.forEach { (item, category) -> println("物品:$item,分类:$category") }
这个正则的逻辑是:匹配("开头,捕获第一个双引号内的物品名,接着匹配逗号和可选空格,再捕获第二个双引号内的分类,最后匹配")结尾。不管Tuple之间有没有空格,都能准确捕获内容。
为什么你之前的split方法失败?
你用的正则分割是按不在引号内的逗号分割,但分割后每个元素会带着首尾的括号/方括号(比如第一个元素是[("egg,第二个是"dairy")),后续还要额外处理这些冗余字符,反而比直接匹配完整Tuple更麻烦。
内容的提问来源于stack exchange,提问作者Rocky Armany
相关产品推荐
相关产品推荐

