应用程序版本的正则表达式

时间:2015-01-22 15:23:30

标签: javascript regex

我想使用模式编写正则表达式来匹配javascript中的应用程序版本:

(0-255).(0-255)[.(0-65535).(0-65535)]

这是我的结果:

^(?:(\d+)\.){1}(?:(\d+)\.){1}(?:(\d+)\.)?(\d+)?$

但它允许带有点的字符串(如'111.222.333。')并且不限制位数。 有帮助吗?

更新

这种模式更好:

(0-255).(0-255)[.(0-65535)][.(0-65535)]

结果是:

^(?:[0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.](?:[0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?:(?:[.](?:[0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){1})?(?:(?:[.](?:[0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){1})?$

1 个答案:

答案 0 :(得分:1)

我认为最好的解决方案是按.拆分并检查每个部分:

function isInBounds(value, min, max) {
    return !isNaN(value) && value >= min && value <= max;
}

function checkVersion(version) {
    var parts = version.split(".");
    switch (parts.length) {
    case 4:
    case 3:
        for (var i = 2; i < parts.length; i++) {
            if (!isInBounds(parseInt(parts[i], 10), 0, 65535)) {
                return false;                
            }
        }
        // fallthrough
    case 2:
        for (var i = 0; i < 2; i++) {
            if (!isInBounds(parseInt(parts[i], 10), 0, 255)) {
                return false;                
            }
        }
        break;
    default:
        return false;
    }
    return true;
}

console.log(checkVersion("foo"));                 // false
console.log(checkVersion("foo.bar"));             // false
console.log(checkVersion("foo.bar.foo"));         // false
console.log(checkVersion("foo.bar.foo.bar"));     // false
console.log(checkVersion("256"));                 // false
console.log(checkVersion("256.256"));             // false
console.log(checkVersion("256.256.65536"));       // false
console.log(checkVersion("256.256.65536.65536")); // false
console.log(checkVersion("42"));                  // false
console.log(checkVersion("42.42"));               // true
console.log(checkVersion("42.42.42"));            // true
console.log(checkVersion("42.42.42.42"));         // true

jsFiddle


正则表达式可能不是那样,因为它不能很好地处理范围。只是为了挑战,这是你需要的(RegexForRange帮了很多;)):

^(?:[0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.](?:[0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?:(?:[.](?:[0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){1,2})?$

Regular expression visualization

Debuggex

的可视化