Search code examples
groovy

How to parse a string of version numbers in Groovy?


I have a string containing a version number like major.minor.patch.build but I only want to keep major.minor.patch where each number can have 1-3 digits. How can I do this in groovy?

Examples for a result: 1.20.30.44 -> 1.20.30 or 1.21.1.1 -> 1.21.1


Solution

  • This will work for provided examples.

    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'
    

    Note, you'll have to implement some error handling if the input data will have some format deviations.


    Test on more data:

    [
            '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'")
    }
    

    Output:

    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'