如何解析Groovy中的一串版本号?

How to parse a string of version numbers in Groovy?

我有一个包含版本号的字符串,如 major.minor.patch.build 但我只想保留 major.minor.patch其中每个数字可以有 1-3 位数字。 我如何在 groovy 中执行此操作?

结果示例: 1.20.30.44 -> 1.20.30 要么 1.21.1.1 -> 1.21.1

这将适用于提供的示例。

def majorMinorPatchBuild = '1.20.30.44'
def majorMinorPatch
if (majorMinorPatchBuild.toList().count('.') < 3) {
    majorMinorPatch = majorMinorPatchBuild
} else {
    majorMinorPatch = majorMinorPatchBuild.split('\.')[0..-2].join('.')
}
assert majorMinorPatch == '1.20.30'

请注意,如果输入数据存在一些格式偏差,您将必须实施一些错误处理。


测试更多数据:

[
        '1.2.3',
        '1.2.3.4',
        '11.22.33.44',
        '111.222.333.444'
].each {
    def majorMinorPatchBuild = it
    def majorMinorPatch
    if (majorMinorPatchBuild.toList().count('.') < 3) {
        majorMinorPatch = majorMinorPatchBuild
    } else {
        majorMinorPatch = majorMinorPatchBuild.split('\.')[0..-2].join('.')
    }

    println("major.minor.patch: '$it' -> '$majorMinorPatch'")
}

输出:

major.minor.patch: '1.2.3' -> '1.2.3'
major.minor.patch: '1.2.3.4' -> '1.2.3'
major.minor.patch: '11.22.33.44' -> '11.22.33'
major.minor.patch: '111.222.333.444' -> '111.222.333'

在 Groovy 中基本上应该是 one-liners。从 2 开始:

String listBased = '1.20.30.44'.split( /\./ ).take 3 join '.'
String regexBased = '1.20.30.44'.replaceFirst( /(.+)\.[^.]+/, '' )

assert listBased == '1.20.30'
assert regexBased == '1.20.30'

此表达式 returns versionString 的子字符串在最后一个点之前 - 因此结果与您在问题中指定的完全相同:

versionString = '1.20.30.44'
println versionString[0..versionString.lastIndexOf('.')-1]
// => 1.20.30