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

时间:2012-10-16 08:38:11

标签: java regex ip 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

任何帮助都很棒

1 个答案:

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