js正则 多个ip地址用逗号隔开+掩码格式

希望正则的效果如下

192.168.0.1                  // true
192.168.0.1,192.168.0.2      // true
192.168.0.1/24               // true
192.168.0.1,192.168.0.2/12   // true

192.168.0.1,                 // false
192.168.0.1/240              // false

🙏谢谢了!!

阅读 3.2k
2 个回答

匹配一小段需要这么长:

25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d

匹配后面的掩码部分

\/(?:3[0-2]|[1-2]?\d|)

光一个 IP 的正则表达式就这么长(带掩码)

(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)){3}(?:\/(?:3[0-2]|[1-2]?\d|))?

还要匹配列表,得再翻一倍

^(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)){3}(?:\/(?:3[0-2]|[1-2]?\d|))?(?:,(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)){3}(?:\/(?:3[0-2]|[1-2]?\d|))?)*$

上面的再则没有充分测试,所以最好测试好了再用

或者不用正则表达式,写段程序来判断

const cases = [
    "192.168.0.1",
    "192.168.0.1,192.168.0.2",
    "192.168.0.1/24",
    "192.168.0.1,192.168.0.2/12",
    "192.168.0.1,",
    "192.168.0.1/240",
];

function isIpPart(s) {
    const v = parseInt(s);
    return `${v}` === s && v >= 0 && v <= 255;
}

function isMask(s) {
    const v = parseInt(s);
    return `${v}` === s && v >= 0 && v <= 32;
}

function isIp(s) {
    const [ip, mask] = s.split("/");
    const parts = ip.split(".");
    return parts.length === 4 && parts.every(isIpPart)
        && (mask === undefined || isMask(mask));
}

function isIpList(s) {
    return s.split(",").every(isIp);
}

cases.forEach(c => console.log(c, isIpList(c)));

好像写不了正则,你这个规则不统一啊

// 处理逗号分隔含空项

 str.spilt(",")
    .some(e=>e==="")
return false

// 处理路由数字大于两位数

str.match(/\\[0-9]\,/g)
     .some(e=>e.length>4)
return false
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题