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

Groovy正则匹配失败:提取RPM包名称相关字段求助

RPM包名提取问题解决

原有代码的问题

你的正则表达式存在几个关键错误,导致匹配失败:

  1. 多余的转义符:Groovy中用/.../包裹的正则不需要对反斜杠双重转义,你写的\\.会被解析成字面量\.,而非匹配点号,直接导致版本号前的点号无法匹配。
  2. 未转义的点号:正则里的.\\d+中的.是通配符(匹配任意字符),不是字面量点号,应写成\\.\\d+。
  3. 分组逻辑混乱:\\..*会匹配版本号后的所有内容直到.x86_64.rpm,分组嵌套方式错误,无法正确捕获目标字符串。
  4. 未判断匹配状态:若正则不匹配,直接调用group()会抛出异常,需先确认匹配成功。

正确实现代码

针对需求,用精准的正则提取目标内容:

方法一:先捕获带版本的前缀,再拆分纯包名

def fullRpmName = "pkg-name.0.15.0-6.x86_64.rpm"
// 匹配带版本的完整前缀,排除架构和后缀
def matcher = (fullRpmName =~ /^([^.]+\.\d+\.\d+\.\d+-\d+)\.x86_64\.rpm$/)

if (matcher.matches()) {
    def withVersion = matcher.group(1) // 输出 pkg-name.0.15.0-6
    def onlyName = withVersion.take(withVersion.indexOf('.')) // 输出 pkg-name
    println withVersion
    println onlyName
} else {
    println "包名格式不符合预期"
}

方法二:直接用正则捕获两个目标分组

def fullRpmName = "pkg-name.0.15.0-6.x86_64.rpm"
// 分别捕获纯包名、版本发布号两部分
def matcher = (fullRpmName =~ /^([^.]+)\.(\d+\.\d+\.\d+-\d+)\.x86_64\.rpm$/)

if (matcher.matches()) {
    def onlyName = matcher.group(1) // pkg-name
    def withVersion = "${matcher.group(1)}.${matcher.group(2)}" // pkg-name.0.15.0-6
    println withVersion
    println onlyName
} else {
    println "包名格式不符合预期"
}

正则说明

  • ^([^.]+):从字符串开头匹配所有非点号字符,捕获纯包名。
  • \.(\d+\.\d+\.\d+-\d+):匹配点号后,捕获版本号+发布号的组合(如0.15.0-6)。
  • \.x86_64\.rpm$:匹配结尾的架构标识和文件后缀,确保包名格式符合要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:48:11