Bash正则表达式检测IPv6或没有

时间:2014-01-03 19:57:41

标签: regex bash ipv6

我如何修改我编写的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}$

我希望这不会令人困惑。这是每个正则表达式的开头和结尾都省略了middles所以你可以看到()。

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

*更新*

上面的最后一条声明......没有运气。

2 个答案:

答案 0 :(得分:0)

您可以使用|字符指定替换,因此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}$

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

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

编辑如果它是更大的正则表达式的一部分,那么你应该将所有内容都包装在一个组中并删除^$,这样就像{{1} }。由于(|<current-regex>)之前没有任何内容,这意味着该组可以匹配空字符串或当前正则表达式匹配的任何内容。

答案 1 :(得分:0)

根据this post on this site所谓的Stack Overflow this other site有一个解释&amp;一个巨大但非常有用的正则表达式的例子是这样的:

(\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)