正则匹配提取文件名ID返回重复值,原因何在?
正则匹配返回重复结果的原因及解决办法
为什么会出现[ID1, ID1]的重复结果
你写的正则表达式(?<=_)([^_]+)(?=\.\w+$)里包含一个捕获组([^_]+),在Groovy中,使用=~创建的Matcher对象,当你访问fileMatch[0]时,返回的数组包含两部分:
- 第一个元素是整个正则匹配到的完整内容(也就是ID1)
- 第二个元素是第一个捕获组捕获到的内容(正好也是ID1,因为捕获组就是你要提取的ID部分)
这是Groovy Matcher的默认行为,并非操作错误。
解决办法
1. 改用非捕获组,消除额外捕获项
把正则里的捕获组改成非捕获组(?:...),这样Matcher就不会生成额外的捕获结果:
def fileMatch = ("aaaa_bbbb_ID1.txt" =~ /(?<=_)(?:[^_]+)(?=\.\w+$)/); assert fileMatch.size() > 0 println fileMatch[0] // 直接输出ID1
2. 使用Matcher的find()+group()方法
更直观的方式是先定位匹配,再获取结果:
def matcher = ("aaaa_bbbb_ID1.txt" =~ /(?<=_)([^_]+)(?=\.\w+$)/) if (matcher.find()) { println matcher.group() // 输出ID1 // 也可以用matcher.group(1)直接取捕获组内容,结果一致 }
3. 全匹配+解构赋值
利用Groovy的解构赋值特性,结合全匹配正则直接提取ID:
def (_, id) = "aaaa_bbbb_ID1.txt" ==~ /.*_([^_]+)\.\w+/ println id // 输出ID1
内容的提问来源于stack exchange,提问作者manuel_b
相关产品推荐
相关产品推荐

