go实现版本号比较逻辑

逻辑实现

package main

import (
	"fmt"
	"regexp"
	"strconv"
	"strings"
)

var (
	numberRe = regexp.MustCompile("[0-9]+")
	wordRe   = regexp.MustCompile("[a-z]+")
)

func VersionGreaterThanT(a, b string) bool {
	return GreaterThan(a, b)
}

func stripMetadata(v string) string {
	split := strings.Split(v, "+")
	if len(split) > 1 {
		return split[0]
	}
	return v
}

func periodDashSplit(s string) []string {
	return strings.FieldsFunc(s, func(r rune) bool {
		switch r {
		case '.', '-':
			return true
		}
		return false
	})
}

func GreaterThan(a, b string) bool {
	a = stripMetadata(a)
	b = stripMetadata(b)

	a = strings.TrimLeft(a, "v")
	b = strings.TrimLeft(b, "v")

	aSplit := periodDashSplit(a)
	bSplit := periodDashSplit(b)

	if len(bSplit) > len(aSplit) {
		return !GreaterThan(b, a) && a != b
	}

	for i := 0; i < len(aSplit); i++ {
		if i == len(bSplit) {
			if _, err := strconv.Atoi(aSplit[i]); err == nil {
				return true
			}
			return false
		}
		aWord := wordRe.FindString(aSplit[i])
		bWord := wordRe.FindString(bSplit[i])
		if aWord != "" && bWord != "" {
			if strings.Compare(aWord, bWord) > 0 {
				return true
			}
			if strings.Compare(bWord, aWord) > 0 {
				return false
			}
		}
		aMatch := numberRe.FindString(aSplit[i])
		bMatch := numberRe.FindString(bSplit[i])
		if aMatch == "" || bMatch == "" {
			if strings.Compare(aSplit[i], bSplit[i]) > 0 {
				return true
			}
			if strings.Compare(bSplit[i], aSplit[i]) > 0 {
				return false
			}
		}
		aNum, _ := strconv.Atoi(aMatch)
		bNum, _ := strconv.Atoi(bMatch)
		if aNum > bNum {
			return true
		}
		if bNum > aNum {
			return false
		}
	}

	return false
}

使用


func main() {
	// 参数1 > 参数2 的版本时,返回true ,反之为false
	flag := VersionGreaterThanT("1.19.2", "1.3.1")
	fmt.Println(flag)
	flag1 := VersionGreaterThanT("v1.1", "v1.7")
	fmt.Println(flag1)
	flag2 := VersionGreaterThanT("abc.1.11", "abc.1.12")
	fmt.Println(flag2)
	flag4 := VersionGreaterThanT("v.1.b.6", "v.1.b.5")
	fmt.Println(flag4)
}

打印:
true
false
false
true

雨落山岚晚成风

发布了155 篇原创文章 · 获赞 74 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/HYZX_9987/article/details/103423156