我试图创建一个正则表达式来检查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
任何帮助都很棒
答案 0 :(得分: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亿个组合返回正确的答案。不应该花太长时间跑......; - )