正则表达式 - 有效的 IPv4,不包括组播地址和广播地址



我试图创建一个正则表达式来检查IP是否有效和可用。我们希望排除那些匹配多播地址(例如 224.0.0.2)和地址(例如 0.0.0.0)的地址。

目前的代码检查范围 0-255 之间的任何内容,但我无法弄清楚如何实现它。

到目前为止,我的代码是

^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b

任何帮助都会很棒

它将是最便携的,最容易编写的,最容易维护的将是分部分进行。

b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b

这将仅匹配有效的IP地址,并将每个部分拆分出来以供进一步检查

if (int(group[1]) != 224 and (int(group[1]) != 0 or int(group[2]) != 0 or int(group[3]) != 0 or int(group[4]) != 0) ...

正则表达式不太擅长"但不擅长"操作。

但是,如果您坚持将其作为单个正则表达式,则只需枚举所有有效选项即可。

b(25[0-5]|2[0134][0-9]|22[0-35-9]|1[0-9][0-9]?|[2-9][0-9]|[2-9])
.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b

。这并不完美,因为它只测试第一个八位字节不是 224 或 0。 如果你想对 0.0.0.0 进行全面测试,那么你必须重现上述 15 次,识别至少一个八位字节不为零的所有组合。

当然,您需要编写一个测试,以确保为所有 40 亿种组合返回正确答案。 应该不会花太长时间运行... ;-)

最新更新