正则提取XML中Release及Version版本列表失败问题排查
问题解决:从XML中提取release和version版本列表
问题原因
- 正则表达式不匹配目标内容:当前正则
/[7]{1}\.[0-9]{1,}\..*/仅匹配以7开头的版本号,但XML中的版本均以1开头,完全不匹配,导致返回空列表。 findAll用法错误:findAll{it=~regex}会遍历字符串的每个字符,将单个字符与正则匹配,显然无法匹配版本号格式,应该使用findAll(regex)重载方法提取所有符合正则的子串。
正则表达式解决方案
修正正则,精准匹配<release>和<version>标签内的版本号(避免误匹配XML声明的1.0),并调整findAll用法:
def listOfVersion = uc.getInputStream().text // 正向断言匹配标签内的版本号 def regex = /(?<=<(release|version)>)\d+\.\d+(\.\d+)*(?=<\/(release|version)>)/ def versions = listOfVersion.findAll(regex) println versions
执行后输出:[1.0.0, 1.0.0.2, 1.0.0.1, 1.0.0.0]
更可靠的XML解析方案
正则处理XML易受标签格式(如换行、空格)影响,推荐使用Groovy内置的XmlSlurper直接解析XML结构:
def xml = new XmlSlurper().parse(uc.getInputStream()) def releaseVersion = xml.versioning.release.text() def versionList = xml.versioning.versions.version*.text() def allVersions = [releaseVersion] + versionList println allVersions
执行后输出同样符合预期的版本列表,且适配各种合法的XML格式。
内容的提问来源于stack exchange,提问作者Laplas
相关产品推荐
相关产品推荐

