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

