Jenkins Groovy中如何简洁提取{{}}包裹的字符串内容?
在Jenkins Groovy中提取{{}}中的内容
你的问题核心是用正则捕获字符串中{{ }}包裹的内容,之前的写法有两个问题:一是Groovy字符串没有regex()方法,二是正则没做分组捕获,而且贪婪匹配可能导致结果不符合预期。下面给你两种简洁可靠的实现方式:
单个匹配场景(字符串中只有一个{{}})
直接用Groovy的正则匹配操作符=~创建Matcher,捕获中间内容后提取:
def line = "The sun slowly descended below the horizon, casting vibrant hues of orange and {{ pink }} across the tranquil sea." // 创建正则匹配器,用非贪婪捕获组匹配{{}}之间的内容 def matcher = line =~ /\{\{(.*?)\}\}/ if (matcher.find()) { def findColor = matcher.group(1).trim() // trim去掉前后多余空格 println(findColor) // 输出: pink }
\{\{和\}\}是转义后的大括号(因为大括号在正则里是量词符号,必须转义)(.*?)是非贪婪捕获组,会匹配到第一个}}就停止,避免多个{{}}时匹配错误group(1)获取捕获组里的内容,trim()根据需求可选(如果你的{{}}中间有空格的话)
多个匹配场景(字符串中有多个{{}})
如果要提取所有{{}}里的内容,可以用更简洁的collect写法一次性获取:
def line = "The {{ sun }} slowly descended below the {{ horizon }}, casting vibrant hues of {{ orange }} and {{ pink }} across the tranquil sea." // 遍历所有匹配项,提取并整理成列表 def allMatches = (line =~ /\{\{(.*?)\}\}/).collect { match -> match[1].trim() } println(allMatches) // 输出: [sun, horizon, orange, pink]
为什么你之前的写法不生效?
- Groovy字符串没有
regex()方法,正确的正则匹配方式是用=~(部分匹配)或==~(全匹配) - 你写的
.*{{.*}}.*是匹配整个字符串的正则,没有设置捕获组,所以无法提取中间内容;而且.*是贪婪匹配,如果有多个{{}},会直接匹配到最后一个}},结果不符合预期
内容的提问来源于stack exchange,提问作者TheDESTROS
相关产品推荐
相关产品推荐

