0

我正在尝试创建一个正则表达式来检查 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

任何帮助都是极好的

4

1 回答 1

0

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

\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 亿个组合的正确答案。不应该花太长时间来运行...... ;-)

于 2015-04-10T13:12:52.350 回答