Groovy正则匹配失败:提取RPM包名称相关字段求助
RPM包名提取问题解决
原有代码的问题
你的正则表达式存在几个关键错误,导致匹配失败:
- 多余的转义符:Groovy中用
/.../包裹的正则不需要对反斜杠双重转义,你写的\\.会被解析成字面量\.,而非匹配点号,直接导致版本号前的点号无法匹配。 - 未转义的点号:正则里的
.\\d+中的.是通配符(匹配任意字符),不是字面量点号,应写成\\.\\d+。 - 分组逻辑混乱:
\\..*会匹配版本号后的所有内容直到.x86_64.rpm,分组嵌套方式错误,无法正确捕获目标字符串。 - 未判断匹配状态:若正则不匹配,直接调用
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
相关产品推荐
相关产品推荐

