1 回答

TA贡献1829条经验 获得超13个赞
- 忘了 IP 段可以为 0,所以修改了下,现在范围是 0.0.0.0 ~ 255.255.255.255
先来验证一个 IP,每个 IP 分为 4 个段,每个段的规则如下
一位数,/[1-9]/
二位数,/[1-9]\d/
三位数,首位是 1,/1\d{2}/ 或者 /1\d\d/
三位数,首位是 2,第二位不是 5,/2[0-4]\d/
三位数,首位是 2,第二们是 5,/25[0-5]/
然后把这些规则用 | 组合起来,就是 IP 中的一段的验证规则
/[1-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]/
四段组合成的 IP 是由一个上述的一段加三个带点号验证的一段,所以是
示意:/one(?:\.one){3}/,写出来就是
/(?:[0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(?:\.([0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3}/
逗号分隔的多个IP,那就是,每个前面是逗号(,)或起始标记(^),一共无数个……所以
/^(?:(?:^|,)(?:[0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])(?:\.(?:[0-9]|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){3})+$/
补充
说实在的,写正则确实痛苦,可以写个函数来解决,可能更容易懂也更不容易出错
function testIpList(ips) {
// 把 ips 按逗号拆成 IP 数组,分别进行验证
// every 表示每个 ip 验证通过才算通过
return ips.split(",")
.every(ip => {
// 把每个 IP 拆成几段
const segments = ip.split(".");
// 如果是精确的 4 段而且每段转换成数字都在 1~255 就对了
return segments.length === 4
&& segments
.map(segment => parseInt(segment, 10) || 0)
.every(n => n >= 0 && n <= 255);
});
}
添加回答
举报