我想使用模式编写正则表达式来匹配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})?$
答案 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
正则表达式可能不是那样,因为它不能很好地处理范围。只是为了挑战,这是你需要的(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})?$
的可视化