【问题标题】:Distinguish between IPv4 and IPV6 regexp - match for : sufficient?区分 IPv4 和 IPV6 正则表达式 - 匹配:是否足够?
【发布时间】:2013-07-12 18:56:34
【问题描述】:

我有一个子例程,需要根据地址是 IPV4 还是 IPV6 执行 2 个不同的操作。如果我只是模式匹配 ':' 来确定地址是否是 IPV6 ?

有什么例外吗?

例如:1.1.1.1 没有冒号 1::1 有:

上述方法也适用于子网: 例如:1.2.3.4/24 2002::1.2.3.4/120

我不想对 IPV4 或 IPV6 使用庞大的正则表达式模式匹配。 谢谢。

【问题讨论】:

  • 120.0.0.1:8000 呢?
  • 匹配点感觉更安全
  • @JanDvorak 如果您匹配正确的网址。但不适用于 IP 地址。
  • @JanDvorak, ::FFFF:192.168.1.1 是有效的 IPv6 地址。

标签: regex ipv6 ipv4 colon


【解决方案1】:

如果你想要一个完整的 IPV6 匹配,那么有一个完整的正则表达式 here:

【讨论】:

  • 虽然理论上可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。您是否忘记实际引用参考文献?
  • @Jan,使用的正则表达式太大,因此我只是添加了链接。下次一定要报价。
【解决方案2】:

简而言之,如果输入中的冒号数 >=2,则认为它是 IPv6。


我遇到了同样的问题,输入可以是 IPv4 或 IPv6 或主机名,并且在每种情况下都可以选择端口。根据输入,需要使用适当的正则表达式对其进行验证。

我考虑的方法是计算输入中的冒号数。如果colonCount >= 2 => IPv6,否则为 IPv4 或主机名。如果 IPv6 存在于 []: 之间,则稍后会根据端口的存在来提取 IPv6。对于 v4/host,只需使用 : 拆分即可。剩余的字符串是纯 IP 地址 (v4/v6) 或主机名,可以使用适当的正则表达式进行评估。

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2014-11-02
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 2012-10-18
    • 2016-01-31
    相关资源
    最近更新 更多