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

Groovy如何从列表中提取匹配子列表关键词的目标字符串

Groovy提取配置中匹配子串的键值对实现

场景复现

  • 脚本中预定义待匹配的子串列表:
subList = ["foo", "bar", "baz"]
  • 待读取的配置文件master_list.txt内容如下:
MASTER_STRING="ping:123 foo:321 pong:999 bar:888"
OTHER_STRING=helloWorld
  • 需求:从MASTER_STRING的取值中提取所有前缀在subList中的键值对,上述示例预期输出为["foo:321", "bar:888"]

原代码问题

你当前代码的核心问题是用布尔类型变量exists接收了findAll方法的返回值:findAll本身会返回所有符合匹配规则的元素组成的列表,赋值给布尔变量时只会保留真假判断结果,匹配到的具体内容会丢失,自然无法输出目标列表。
另外原匹配逻辑用contains判断存在误判风险:如果某个片段包含子串但子串不在键的位置(例如片段xfool:000包含foo但不属于目标匹配项),会被错误识别。

修正后可运行代码

props = readProperties file: "master_list.txt"
def matchedItems = []
if (props.containsKey('MASTER_STRING')) {
   def masterList = props.MASTER_STRING.split(/ /)
   matchedItems = masterList.findAll { segment ->
       subList.any { targetKey -> segment.startsWith("${targetKey}:") }
   }
}
if (matchedItems) {
   println "at least one item exists"
   println matchedItems // 此处输出即为["foo:321", "bar:888"]
}

关键改动点

  • 移除原布尔类型的exists变量,改用列表类型的matchedItems存储findAll返回的匹配结果
  • 匹配逻辑调整为判断片段是否以待匹配子串+冒号开头,避免子串位置错误导致的误匹配
  • 直接通过判断matchedItems是否非空确认是否存在匹配项,Groovy中空列表会自动判定为逻辑假,非空列表判定为逻辑真,不需要额外调用size()或isEmpty()方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:42:17