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
相关产品推荐
相关产品推荐

