常见的版本号命名方式,GNU,WINDOWS等,无外乎数字+字母,数字可能就是版本的迭代,如:V1.2.3, 也可能是日期,如V2018-06-25, 20180625。还有可能跟上阶段命名如 α β γ等。如果你只想比较数字部分,只需要去掉非数字部分,比较大小就行。
如果要比较字母部分,那要区分来看,对a b c这种,直接转成小写做大小比较就行。对trial, demo, unregistered这些,你要做个字典了。
如js代码let version1 = 'v1.2.3a';let version2 = 'v1.2.4b';let versionNumber1 = version1.replace(/[a-zA-Z]/g, (match,i)=> match.charCodeAt()).replace(/[^\d]/g, '') - 0;let versionNumber2 = version2.replace(/[a-zA-Z]/g, (match,i)=> match.charCodeAt()).replace(/[^\d]/g, '') - 0;console.log(versionNumber1 > versionNumber2);
以上代码面对 v1.2.97a 和 v1.10.1b 这样位数不一样的版本号可能有问题,特改进下,差异太大的就不行了,比如比较v2021333,v1.2.3
let version1 = 'v1.2.97a';let version2 = 'v1.10.1b';let versionArr1 = version1.replace(/[a-zA-Z]/g, (match,i)=> '.' + match.charCodeAt()).split(/[^\d]/);let versionArr2 = version2.replace(/[a-zA-Z]/g, (match,i)=> '.' + match.charCodeAt()).split(/[^\d]/);// 保证两个数据长度一样,面向 `v1.2` 和 `v1.2.3` 这样的情况if(versionArr1.length > versionArr2.length) {
versionArr2.splice(versionArr2.length, 0, ...Array(versionArr1.length-versionArr2.length).fill(0))
} else {
versionArr1.splice(versionArr1.length, 0, ...Array(versionArr2.length-versionArr1.length).fill(0))
}// 按节比较let result = 'version1 equels version2.'for(let i=0 ; i versionArr2[i]) {
result = 'version1 is bigger.'; break;
} else if (versionArr1[i]
result = 'version2 is bigger.'; break;
}
}console.log(result);