【问题标题】:Regular Expression - Valid IPv4 excluding multicast addresses and broadcast addresses正则表达式 - 有效 IPv4,不包括多播地址和广播地址
【发布时间】:2012-10-06 07:31:02
【问题描述】:

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

任何帮助都会很棒

【问题讨论】:

  • 拆分. 然后测试每个元素会更容易。
  • 分割开是什么意思。 ?抱歉,我对正则表达式还很陌生
  • 我的意思是将IP地址的4个元素分开。
  • 您想在 .Net 中得到答案吗?
  • 我正在用 java 编程。

标签: java regex ip ipv4


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 2012-10-20
    • 2019-09-02
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多