【问题标题】:Regex for IP within a text line文本行中 IP 的正则表达式
【发布时间】:2014-11-07 11:55:36
【问题描述】:

我想从如下文本行中获取 IPv6 或 IPv4 收件人

TST: 20141104-03:03:56 管理 - 切换到 IP6Fast -> 提供 IP gd66:7::y4u0:345:4t7j:af 不是 IPv4,不能切换

TST: 20141104-03:03:56 管理 - 切换到 IP4Fast -> 提供 IP 192.168.10.1 不是 IPv6,不能切换

我的正则表达式可以识别 IPv6 和 IPv4 的 IP 地址,但是只有一个用于 IPv4 的表达式可以处理附近的文本,如果 IPv6 地址周围有文本,则 IPv6 不能识别 IPv6 地址。我该如何解决这个问题?

提前致谢,

我的正则表达式是这些(首先是 IPv4,其余的是 IPv6)

((\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b)|
(\\b^(?:(?:[0-9A-Fa-f]{1,4}:){6}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|::(?:[0-9A-Fa-f]{1,4}:){5}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){4}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){3}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,2}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:){2}(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,4}[0-9A-Fa-f]{1,4})?::(?:[0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|(?:(?:[0-9A-Fa-f]{1,4}:){,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(?:(?:[0-9A-Fa-f]{1,4}:){,6}[0-9A-Fa-f]{1,4})?::)$)\\b)

【问题讨论】:

    标签: regex ipv6


    【解决方案1】:

    您的 IPv4 正则表达式实际上不起作用,因为它允许像 333.444.555.666 这样的内容,这对于 IPv4 地址无效。像这样的东西效果更好(这是 PCRE 正则表达式):

    \b(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b
    

    就 IPv6 而言,您是否尝试捕获未压缩、压缩和/或混合的?它可能会变得非常复杂。

    您的 IPv6 正则表达式不匹配的原因是您已将其包装在 ^$ 中,它们指定了字符串的开始和和。这可以防止任何带有额外内容的字符串匹配。

    【讨论】:

    • 老实说,@ndarkness 可能不需要检查准确的 IP 地址,而只是寻找“文本中的类似 IP 的字符串”。此外,您的正则表达式不支持可能被视为有效 IP 地址的前导零(即 127.000.000.001) - Raymond Chen shows one here
    • 前导零是一件坏事。它们通常被解释为八进制数,不应在 IPv4 地址中使用。大多数 IPv4 正则表达式不包括它们。我提供的 IPv4 正则表达式不允许无效的 IPv4 地址,这是我唯一的观点。
    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多