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

Groovy解析多条目数据库内容时仅匹配首个结果的解决方法

解析SQL中设备的所有关联条目

问题背景

数据库中部分设备对应多条注释条目,例如Device1关联comment1、comment2、comment3,Device2关联comment4、comment5等。通过Groovy获取目标SQL语句后,现有解析代码仅能匹配到每个设备的首个关联条目,无法提取全部内容。

现有获取SQL的代码

def query=resolve.resolve_db.rows("select u_sql from resolve.database_filter where u_name='Suppress Alerts - Hide Alerts' and u_queue='DATABASE'" as String)
query=query.u_sql[0].toString()

现有解析代码(仅匹配首个条目)

if (query.contains(device))  {
    def text=StringUtils.substringBetween(query, "$device%')", "(lower(alert.client)");
    if (text == null) text=StringUtils.substringBetween(query, "$device%')", "ORDER BY alert.created");
    def name=StringUtils.substringBetween(text, "lower('%", "%')");
}

修改方案:用正则匹配所有条目

由于StringUtils.substringBetween仅能返回第一个匹配的子串,改用正则表达式可以遍历所有符合条件的内容。示例代码如下:

if (query.contains(device)) {
    // 构建正则表达式,匹配$device%')之后的lower('%...%')内容
    def pattern = Pattern.compile(/\Q${device}%')\E.*?lower\('%([^%]+)%'\)/, Pattern.DOTALL)
    def matcher = pattern.matcher(query)
    
    // 遍历所有匹配项,提取注释内容
    while (matcher.find()) {
        def comment = matcher.group(1)
        // 这里处理每个提取到的comment,比如打印、存入集合等
        println "找到设备${device}的关联注释:${comment}"
    }
}

代码说明

  • 正则中的\Q...\E用于转义设备名称中的特殊字符,避免正则语法冲突
  • .*?是非贪婪匹配,确保匹配到最近的lower('%...%'),不会跨条目匹配
  • Pattern.DOTALL让.可以匹配换行符,适配SQL语句可能的换行格式
  • 通过matcher.find()循环遍历所有匹配结果,逐个提取注释内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:15:40