【问题标题】:Regex for IPv4 Routable address only仅适用于 IPv4 可路由地址的正则表达式
【发布时间】:2011-01-18 02:10:33
【问题描述】:

什么是只能找到可路由 IPv4 地址的正则表达式?例如,与 192.0.2.1/24、127.0.0.1 等不匹配。Google 似乎只能找到最常见的“是一个 IP 地址”正则表达式。

【问题讨论】:

  • 对我来说,这听起来不像是正则表达式的明显用例。您有什么理由必须使用正则表达式来做到这一点?
  • 我认为这是最好的方法,但从 Anon.'s answer 我认为现在有更好的方法。

标签: regex ip-address


【解决方案1】:

尝试在正则表达式中实现业务规则是个坏主意。

只需解析 IP 地址,并在代码中检查它是否满足您的条件。

【讨论】:

    【解决方案2】:

    试试这个:

    ^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?<!172\.(16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31))(?<!127)(?<!^10)(?<!^0)\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?<!192\.168)(?<!172\.(16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31))\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?<!\.0$)(?<!\.255$)$
    

    它正确地不匹配这个无效的ips:

    999.999.999.999.
    108.0.0.01
    0.1.2.3
    00.0000.00.00
    192.168.1.1
    912.456.123.123
    .3.3.3.0
    3.2.2.0
    192.168.0.0
    18.16.0.0
    

    不匹配本地 IP:

    172.16.0.9
    172.16.4.1
    172.17.1.1
    127.0.0.2
    10.0.1.5
    10.0.0.1
    10.155.155.155
    10.255.255.254
    172.16.0.4
    172.16.0.1
    172.17.1.1
    172.31.254.254
    

    最后它不匹配广播 IP:

    60.123.247.255
    196.168.255.255
    10.255.255.255
    192.168.255.255
    

    到目前为止,我测试过的所有其他 IP 都是匹配的,但我还没有彻底完成,所以可能存在一些错误。

    【讨论】:

      【解决方案3】:

      无论如何,您都不能在正则表达式中执行此操作,效率不高。解析它,然后检查特殊情况的地址(多播、RFC 1918 等)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-31
        • 2018-02-27
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多