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

正则匹配提取文件名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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:52:43