IPv4 和 IPv6 正则表达式
Pv4 地址例如,”192.168.0.2“,为 . 分割的4段数字,数字范围为 0 - 255,而我们的正则表达式需要匹配的就是 0 - 255,首先我们对这一区间进行拆分:
1. 0 - 9 只有一位数字,正则表达式:\d;
2. 10 - 99 二位数,十位数1 - 9,个位数 0 - 9,正则表达式:[1-9]\d;
3. 100 - 199,百位数 1,十位数个位数均为 0 - 9,正则表达式:1\d\d;
4. 200 - 249,百位数 2,十位数 0 - 4,个位数 0 - 9,正则表达式:2[0-4]\d;
5. 250 - 255,百位数 2,十位数5,个位数 0 - 5,正则表达式:25[0-5]
步骤4、5可以进行一次整合:2([0-4]\d|5[0-5])(200 - 255)。
综上在结合 . 这个连接符,在IP最后手动填上一个 . 就可以重复4次,最后的正则表达式为:
var ipv4 = /^()(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.){4}$/;
return ipv4.test(IP + ".");
IPv6 正则规则
IPv6 地址例如,”2001:0db8:85a3:0000:0000:8a2e:0370:7334“,为 : 分割的8段数字,每段数字最多4位,最少1位,每位可由 0-9数字、a-f 小写字母、A-F 大写字母组成,与 IPv4 一样为了简略正则表达式,在IP后手动填上一个 :。
var ipv6 = /^(([\da-fA-F]{1,4}):){8}$/
return ipv6.test(IP + ":");
原题来自 leetcode 第468题(Validate IP Address),题意为设计一个函数检测 IP 是 IPv4 还是 IPv6。
/**
* @param {string} IP
* @return {string}
*/
var validIPAddress = function(IP) {
var ipv4 = /^((\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.){4}$/;
var ipv6 = /^(([\da-fA-F]{1,4}):){8}$/
return ipv4.test(IP + ".") ? "IPv4" : ipv6.test(IP + ":") ? "IPv6" : "Neither";
};