【问题标题】:Bash regex to detect IPv6 or none [duplicate]Bash正则表达式检测IPv6或无[重复]
【发布时间】:2014-01-21 14:22:04
【问题描述】:

我将如何修改我编写的这个 IPv6 正则表达式以检测地址(即现在编写正则表达式的方式),但也接受“空白”,即用户没有指定 IPv6 地址?

^[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-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}$

现在,正则表达式正在寻找至少 0:0:0:0:0:0:0:0 或类似的值。事实上,除了空白地址之外,我可能还需要能够处理压缩,例如以下地址:

FE80::1
or ::1
etc

谢谢!

* 更新 *

所以让我确保我有这个直...

(^$|^IPV4)\|(^$|IPV6)\|REST OF STUFF$

这似乎不对。我觉得我放错了 ^ 和 $ 以及整个正则表达式的开头和结尾。

也许是这样:

 ^(^$|IPV4)\|(^$|IPV6)\|REST$

* 更新 *

仍然没有运气。这是我的代码的一部分,为了保持理智,中间被砍掉了:

^(|[0-9]{1,3}.<<<OMIT MIDDLE IPV4>>>.[0-9]{1,3})\|(|(\A([0-9a-f]{1,4}:){1,1}<<<OMIT MIDDLE IPV6>>>[0-1]?\d?\d)){3}\Z))\|[a-zA-Z0-<<<MORE STUFF MIDDLE OMITTED>>>{0,50}$

我希望这不会令人困惑。这是每个正则表达式的开头和结尾,中间省略了,因此您可以看到 ( )。

也许我需要将整个巨大的 IPV6 正则表达式括在括号中?

* 更新 *

尝试了上面的最后一条语句......没有运气。

【问题讨论】:

    标签: regex bash ipv6


    【解决方案1】:

    您可以使用| 字符指定交替,因此a|b 表示“匹配ab”。在这种情况下,它看起来像这样:

    ^$|^[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-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}$
    

    正则表达式^$ 将匹配空字符串,因此^$|&lt;current-regex&gt; 表示“匹配空字符串或&lt;current-regex&gt; 匹配的任何内容(在本例中为IPv6)”。如果您希望仅包含空白字符的字符串也被视为“空”,则可以使用 ^\s*$ 代替 ^$

    这只是处理问题的第一部分,处理像FE80::1 这样的压缩更复杂,看起来在 cmets 中已经有一些其他好的答案(请注意,我不认为这个问题是欺骗,因为这些问题中不存在“也匹配空字符串”部分)。

    编辑:如果它是更大的正则表达式的一部分,那么您应该将所有内容包装在一个组中并去掉^$,所以它会类似于(|&lt;current-regex&gt;)。由于| 之前没有任何内容,这意味着该组可以匹配空字符串或您当前的正则表达式匹配的任何内容。

    【讨论】:

    • 感谢潜在的解决方案,但我认为它不适用于我的情况。我认为这是微不足道的,所以我没有包含额外的细节,但是这个 IPv6 正则表达式只是一个更大的正则表达式的一部分。问题是,IPV6 部分是分隔字符串。例如: IPv4 地址|IPv6 地址|更多的东西 所以实际上我需要允许正则表达式的各个部分(| 之间的地址)为空
    • @Atomiklan 查看我的编辑,我描述了如何将这种方法用作更大的正则表达式的一部分。
    • 非常感谢你,我想你让我接近了,但我仍然放错了一些字符。请在主帖中查看我的更新。
    • 糟糕,我的错。您实际上会想要删除锚点,所以它会类似于 ^(|IPV4)\|(|IPV6)\|REST$
    • 嗯,还是少了点什么。回来是无效的。我会更新上面的帖子。
    【解决方案2】:

    根据this post on this site 称为堆栈溢出this other site 有一个巨大但非常有用的正则表达式的解释和示例:

    (\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,6}\Z)|
    (\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}\Z)|
    (\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}\Z)|
    (\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}\Z)|
    (\A([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}\Z)|
    (\A([0-9a-f]{1,4}:){1,6}(:[0-9a-f]{1,4}){1,1}\Z)|
    (\A(([0-9a-f]{1,4}:){1,7}|:):\Z)|
    (\A:(:[0-9a-f]{1,4}){1,7}\Z)|
    (\A((([0-9a-f]{1,4}:){6})(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
    (\A(([0-9a-f]{1,4}:){5}[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})\Z)|
    (\A([0-9a-f]{1,4}:){5}:[0-9a-f]{1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
    (\A([0-9a-f]{1,4}:){1,1}(:[0-9a-f]{1,4}){1,4}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
    (\A([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,3}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
    (\A([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,2}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
    (\A([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,1}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
    (\A(([0-9a-f]{1,4}:){1,5}|:):(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)|
    (\A:(:[0-9a-f]{1,4}){1,5}:(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\Z)
    

    【讨论】:

    • 感谢您的帖子。这解决了压缩问题。我在最后一分钟为空字段写帖子时想到了它,所以我没有先进行搜索。对不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2012-12-12
    • 2014-02-05
    相关资源
    最近更新 更多