Jenkins Pipeline中如何将特定格式Groovy字符串转换为Map?
解决Jenkins选择参数字符串转Groovy Map的问题
嘿,刚接触Groovy和Jenkins Pipeline的话,碰到这种格式有点“别扭”的字符串转Map确实容易头疼——我来给你一套可行的方案,亲测能用!
首先先拆解下你拿到的这个字符串格式:
[fileListJs:file1.js,file2.js,file3.js, fileListHtml:file4.html,file5.html,file6.html, fileListCss:file6.css,file7.css,file8.html]
它本质是类似Map但语法不标准的字符串:外面多了一层方括号,每个键值对用“逗号+空格”分隔,值是逗号拼接的文件名,甚至末尾可能还带多余的逗号。我们需要一步步把它转换成标准的Groovy Map,其中每个值是文件名列表。
具体实现代码
直接上可运行的Groovy代码,你可以放到Jenkins Pipeline里测试:
// 替换成你从Jenkins选择参数拿到的实际字符串 def jenkinsParamStr = "[fileListJs:file1.js,file2.js,file3.js, fileListHtml:file4.html,file5.html,file6.html, fileListCss:file6.css,file7.css,file8.html]" // 步骤1:清理字符串——去掉首尾的方括号,同时移除末尾可能存在的多余逗号和空格 def cleanedStr = jenkinsParamStr.replaceAll(/^\[|\]$/, "").replaceAll(/,\s*$/, "") // 步骤2:分割成独立的键值对——用正则匹配"逗号+空格+键名:"的位置来分割,确保不会把值里的逗号当成分隔符 def keyValuePairs = cleanedStr.split(/,\s(?=\w+:)/) // 步骤3:构建最终的Map,每个值转成文件名列表 def fileMap = [:] keyValuePairs.each { pair -> // 只分割一次冒号,避免文件名里意外出现冒号(虽然概率极低) def (key, fileNameStr) = pair.split(":", 2) // 把逗号分隔的文件名转成列表 def fileList = fileNameStr.split(/,\s*/) fileMap[key] = fileList } // 测试输出,验证结果 println "转换后的Map:${fileMap}" println "JS文件列表:${fileMap.fileListJs}" println "HTML文件列表:${fileMap.fileListHtml}"
代码解释
- 清理字符串:用正则
/^\[|\]$/去掉首尾的方括号,/,\s*$/处理掉末尾可能残留的逗号和空格,避免后续分割出错。 - 分割键值对:正则
/,\s(?=\w+:)/是关键——它会匹配“逗号+空格”后面紧跟“字母开头的键名+冒号”的位置,这样就能精准把每个key:value拆分开,不会误切割值里的逗号。 - 构建Map:对每个键值对,只分割一次冒号(
split(":",2)),然后把值部分分割成列表,最终存入Map。
如果你的Jenkins选择参数返回的格式和示例完全一致,这个代码直接就能用。要是遇到特殊情况(比如文件名里有逗号),可以再调整正则,但一般Jenkins的选择参数不会返回带逗号的选项值~
内容的提问来源于stack exchange,提问作者Mick Feller
相关产品推荐
相关产品推荐

