Groovy中如何遍历Pattern匹配结果?遇IllegalStateException异常
正确遍历Groovy正则匹配结果的方法
先修正你的正则表达式问题
你的原正则crt1234[a-z]_(\w\w)_DTS(.*)存在两个问题:
- 单引号字符串中,转义字符需要双反斜杠,所以
\w要写成\\w,否则会被当作普通字符处理。 - 目标字符串是
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
你原代码抛出异常的原因
- 正则不匹配目标字符串,导致没有任何匹配结果,此时调用
group(i)会直接抛出IllegalStateException。 - 即使正则匹配成功,
Matcher的group()方法必须在find()或matches()调用成功后才能使用,你直接通过count遍历的方式,没有触发匹配查找,自然会报错。
内容的提问来源于stack exchange,提问作者user3411153
相关产品推荐
相关产品推荐

