📅  最后修改于: 2023-12-03 14:42:09.843000             🧑  作者: Mango
在开发过程中,我们常常需要验证是否输入的 IP 地址是否合法。而使用正则表达式可以方便而快速地完成这项任务。本篇文章将向大家介绍如何在 JavaScript 中使用正则表达式来验证 IP 地址的合法性。
IP 是 Internet Protocol 的缩写,指的是网络协议中的一种。它定义了在 Internet 上,数据如何从一个网络节点传递到另一个节点。在计算机网络通信中,IP 地址是指在 Internet 上标识一个节点的数字标识。
IP 地址通常以“点分十进制”(IPv4)或“冒号分十六进制”(IPv6)的格式表示。IPv4 地址由 4 个 0 到 255 的数字组成,中间用小数点分隔。而 IPv6 地址由多个由冒号分隔开的 16 位十六进制数字来表示。
/^((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})$/
上述正则表达式可以匹配 IPv4 地址。其中,^ 表示起始位置,$ 表示终止位置,\d 表示匹配数字,[01]?\d{1,2} 表示匹配 0 到 199 之间的数字,2[0-4]\d 表示匹配 200 到 249 之间的数字,25[0-5] 表示匹配 250 到 255 之间的数字,. 表示匹配小数点,{3} 表示前面的组(最大匹配三次)。
/^((?=.*(::))(?!.*\3.+\3)(::)?[\dA-F]{1,4}(\3[\dA-F]{1,4}){7}|([\dA-F]{1,4}:){7}[\dA-F]{1,4})$/i
上述正则表达式可以匹配 IPv6 地址。其中,\dA-F 表示匹配 十六进制数字 A 到 F,(?=.*(::)) 表示至少有两个连续的冒号。匹配模式(::)不能同时解释成两个连续的 0。 (\3[\dA-F]{1,4}){7} 匹配形如 1234::5678 这样的地址。由于匹配长度不固定,需要对超过 8 个组的地址进行特殊处理。
function isIPv4(str) {
const pattern = /^((25[0-5]|2[0-4]\d|[01]?\d{1,2})\.){3}(25[0-5]|2[0-4]\d|[01]?\d{1,2})$/;
return pattern.test(str);
}
function isIPv6(str) {
const pattern = /^((?=.*(::))(?!.*\3.+\3)(::)?[\dA-F]{1,4}(\3[\dA-F]{1,4}){7}|([\dA-F]{1,4}:){7}[\dA-F]{1,4})$/i;
return pattern.test(str);
}
console.log(isIPv4('192.168.1.1')); // true
console.log(isIPv4('192.256.1.1')); // false
console.log(isIPv6('2001:0db8:85a3:0000:0000:8a2e:0370:7334')); // true
console.log(isIPv6('2001:0db8:85a3:00000:0000:8a2e:0370:7334')); // false
在上述代码中,我们定义了两个检查方法 isIPv4 和 isIPv6,分别用以验证 IPv4 地址和 IPv6 地址。在方法中,我们分别使用了前面介绍过的 IPv4 和 IPv6 地址的正则表达式。
最后,我们对上述正则表达式的结果进行了验证,并将结果输出到控制台中。
本篇文章向大家介绍了使用正则表达式在 JavaScript 中验证 IP 地址的合法性。相信大家对正则表达式有了进一步的了解,此外,需要注意的是有很多种方法可以验证 IP 地址的合法性,可能并不局限于本篇介绍的方法。