我正在尝试创建一个正则表达式来检查 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 亿个组合的正确答案。不应该花太长时间来运行...... ;-)