如何解析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
我有一个包含版本号的字符串,如 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