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

Groovy如何获取列表唯一值?正则提取文本结果不符合预期怎么解决?

问题排查与修复方案

存在的问题

  • 正则捕获组导致返回嵌套列表
    Groovy中findAll()方法匹配带捕获组的正则时,返回结构为List<List<String>>,每个匹配结果对应一个子列表,子列表首位是完整匹配内容,后续元素对应各个捕获组的匹配结果,这就是你得到嵌套列表[[ aaa , aaa ], [ bbb , bbb ], [ ccc , ccc ]]的原因。
  • 错误的返回值类型转换
    你将findAll()返回的集合强制声明为String类型,Groovy会自动把集合转为字符串格式,此时调用size()统计的是转换后字符串的字符长度,而非集合元素个数,因此得到错误的48的结果。
  • 匹配结果带多余空格
    正则未过滤START、END与目标内容之间的空格,导致匹配结果首尾带有多余空格。

修复后的代码

如果目标内容不包含空格,可以使用简化写法:

def str = "123  START aaa END  456 START bbb END 789 START ccc END"
def res

res = getTextBetweenTwoStrings(str)

log.info("res = "  + res)
log.info("res size = " + res.size())

def getTextBetweenTwoStrings(String str) {
    def matchStr = /(?<=START\s)\S*(?=\sEND)/ 
    return (str =~ matchStr).findAll()
}

如果目标内容可能包含空格,可以用下面的写法保留内容空格,仅去除首尾多余空格:

def getTextBetweenTwoStrings(String str) {
    def matchStr = /(?<=START)([\s\S]*?)(?=END)/ 
    return (str =~ matchStr).findAll().collect { it[1].trim() }
}

输出结果

res = [aaa, bbb, ccc]
res size = 3

内容的提问来源于stack exchange,提问作者ASE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:48:03