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

Groovy中如何遍历Pattern匹配结果?遇IllegalStateException异常

正确遍历Groovy正则匹配结果的方法

先修正你的正则表达式问题

你的原正则crt1234[a-z]_(\w\w)_DTS(.*)存在两个问题:

  1. 单引号字符串中,转义字符需要双反斜杠,所以\w要写成\\w,否则会被当作普通字符处理。
  2. 目标字符串是crt1234_DH_DTS,crt1234后面直接是下划线,但正则里的[a-z]要求这里必须有一个小写字母,导致整个正则匹配失败,后续调用group必然抛出异常。

修正后的正则可以改成:

def regex = 'crt1234[a-z]?_(\\w\\w)_DTS(.*)'

[a-z]?表示小写字母可选,兼容目标字符串的结构。

正确的遍历方式

方式一:使用findAll()结合闭包(你已用到的方式,可优化)

findAll()会返回所有匹配的MatchResult对象,在闭包里可以直接操作每个匹配的分组:

def regex = 'crt1234[a-z]?_(\\w\\w)_DTS(.*)'
Pattern pattern = Pattern.compile(regex)
Matcher matcher = pattern.matcher("crt1234_DH_DTS")
def group = ""

// 遍历每个匹配结果,处理分组
matcher.findAll { match ->
    // 从1开始遍历分组(0是整个匹配的字符串)
    for (i in 1..match.groupCount()) {
        group += match.group(i)
    }
}

println group // 输出:DH

方式二:使用while(matcher.find())标准遍历(Java/Groovy通用方式)

这是最基础的Matcher遍历逻辑,每次调用find()找到下一个匹配项,然后获取分组:

def regex = 'crt1234[a-z]?_(\\w\\w)_DTS(.*)'
Pattern pattern = Pattern.compile(regex)
Matcher matcher = pattern.matcher("crt1234_DH_DTS")
def group = ""

// 循环查找匹配项
while (matcher.find()) {
    // 遍历当前匹配的所有分组
    for (i in 1..matcher.groupCount()) {
        group += matcher.group(i)
    }
}

println group // 输出:DH

你原代码抛出异常的原因

  1. 正则不匹配目标字符串,导致没有任何匹配结果,此时调用group(i)会直接抛出IllegalStateException。
  2. 即使正则匹配成功,Matcher的group()方法必须在find()或matches()调用成功后才能使用,你直接通过count遍历的方式,没有触发匹配查找,自然会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:29:56