与有效 IPv6 地址匹配的正则表达式

Regular expression that matches valid IPv6 addresses

提问人:readonly 提问时间:9/10/2008 最后编辑:Stefan Lasiewskireadonly 更新时间:12/16/2019 访问量:276863

问:

这个问题的答案是社区的努力。编辑现有答案以改进此帖子。它目前不接受新的答案或交互。

我在编写与有效 IPv6 地址匹配的正则表达式时遇到了问题,包括压缩形式的地址(每个字节对中省略或前导零)。::

有人可以提出一个满足要求的正则表达式吗?

我正在考虑扩展每个字节对并将结果与更简单的正则表达式匹配。

正则表达式 网络 IPv6

评论

1赞 Mottie 1/26/2013
查看 intermapper.com/ipv6validator..它链接到这个 Perl 测试脚本
0赞 gfrobenius 2/22/2014
我已经尝试了下面的所有答案,它们不适用于我的所有测试用例和/或它们还包括未要求的 IPv4。我发现这是迄今为止最干净的解决方案:stackoverflow.com/a/21944928/3112803

答:

27赞 Factor Mystic 9/10/2008 #1

从“IPv6正则表达式”:

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

评论

54赞 Thanatos 8/18/2010
像这样的正则表达式应该是一种“代码味道”,也许正则表达式在这里不是最适合的解决方案。(虽然,我猜操作确实要求它......
12赞 danielpops 1/12/2012
@user712092 -- 每个看过类似代码库的人
3赞 Chuck Kollars 9/7/2015
这是对 RE 的完全不必要的嘲弄。生成它的程序不明白它在做什么。人类永远不会这样做。不要被表面上的复杂性所迷惑——对许多人来说,RE 确实是“黑魔法”,但没有理由将它们放在另一个星球上!
0赞 Tilo 7/29/2016
+1 但 O.M.G. 必须有更好的方法来做到这一点:P作为参考:对于 Rails,这可能会有所帮助:stackoverflow.com/questions/16965697/...
2赞 Gerard ONeill 4/13/2017
这确实是一种代码气味;但是,看完之后,您会发现每个正则表达式都相当简洁。问题在于,ipv6 的“压缩”会产生不同的模式——冒号的开头、中间和结尾,如果你使用了双冒号,你就不能再使用它了,再加上双冒号前后的总冒号必须加起来。Perl 6 也许能够解决这个问题,但它远远超出了 PCRE 语法。(PS -- 我不算最后嵌入的 ipv4,比 ipv6 部分还长!
14赞 Jon Cram 9/10/2008 #2

我必须强烈支持弗兰克·克鲁格(Frank Krueger)的答案。

虽然您说您需要一个正则表达式来匹配 IPv6 地址,但我假设您真正需要的是能够检查给定字符串是否是有效的 IPv6 地址。这里有一个微妙但重要的区别。

有多种方法可以检查给定字符串是否为有效的 IPv6 地址,正则表达式匹配只是一种解决方案。

如果可以,请使用现有库。该库将具有更少的错误,并且使用它将导致需要维护的代码更少。

Factor Mystic 建议的正则表达式很长很复杂。它很可能有效,但您还应该考虑如果它意外失败,您将如何应对。我在这里想说的是,如果你不能自己形成一个必需的正则表达式,你就无法轻松调试它。

如果您没有合适的库,最好编写自己的不依赖于正则表达式的 IPv6 验证例程。如果你写了它,你就理解了它,如果你理解了它,你可以添加注释来解释它,以便其他人也能理解并随后维护它。

使用无法向其他人解释其功能的正则表达式时,请谨慎行事。

评论

1赞 Raedwald 4/2/2013
使用两个正则表达式(一个自由表达式和一个异常表达式)来捕获第一个表达式允许的无效地址可能比一个表达式 () 更容易。return ex1.match(S) && ! ex2.match(S)
5赞 Navin 4/6/2016
您假设他正在验证单个 IP,而他几乎可以肯定是在一大块文本中搜索 IP。
5赞 Brad Gilbert 9/14/2008 #3

如果使用 Perl,请尝试 Net::IPv6Addr

use Net::IPv6Addr;

if( defined Net::IPv6Addr::is_ipv6($ip_address) ){
  print "Looks like an ipv6 address\n";
}

NetAddr::IP

use NetAddr::IP;

my $obj = NetAddr::IP->new6($ip_address);

验证::IP

use Validate::IP qw'is_ipv6';

if( is_ipv6($ip_address) ){
  print "Looks like an ipv6 address\n";
}

评论

0赞 Calimo 12/16/2010
或 Data::Validate::IP search.cpan.org/~neely/Data-Validate-IP-0.11/lib/Data/Validate/...
28赞 Joe Hildebrand 9/17/2008 #4

听起来您可能正在使用 Python。如果是这样,您可以使用如下内容:

import socket

def check_ipv6(n):
    try:
        socket.inet_pton(socket.AF_INET6, n)
        return True
    except socket.error:
        return False

print check_ipv6('::1') # True
print check_ipv6('foo') # False
print check_ipv6(5)     # TypeError exception
print check_ipv6(None)  # TypeError exception

我认为您不必将 IPv6 编译到 Python 中才能获得inet_pton,如果您作为第一个参数传入,它也可以解析 IPv4 地址。注意:这可能不适用于非 Unix 系统。socket.AF_INET

评论

4赞 Ayman Hourieh 12/20/2009
应在子句中指定异常类型。否则,将捕获所有内容,并可能掩盖不相关的错误。此处的类型应为 .exceptexceptsocket.error
0赞 Joe Hildebrand 12/22/2009
A) inet_pton 不会抛出其他异常,除非文档是错误的,并且 B) 即使它有,除了 False 之外,您还会返回什么?
2赞 Gregg Lind 4/22/2010
回复:其他错误...如果用户传入非字符串,则 TypeError 会被吃掉。显然,列表不是 ipv6,但我可能希望它成为我以错误类型传递的鲤鱼。
1赞 mkoistinen 12/5/2013
+1 这对我帮助很大。应该添加几点:1)socket.inet_pton可用于测试两个IP地址系列(IP和IPv6)的有效性。2)这里的文档(docs.python.org/2/library/socket.html)表明这在Unix平台上可用。它可能在 Win 平台上不可用。
0赞 elad silver 5/18/2015
使用 Django,这很有帮助!
-1赞 Aeron 10/15/2009 #5

正则表达式允许在 IPv4 部分中使用前导零。

一些 Unix 和 Mac 发行版将这些段转换为八进制。

我建议用作 IPv4 段。25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d

57赞 14 revsMichaelRushton #6

以下内容将验证 IPv4、IPv6(完整和压缩)和 IPv6v4(完整和压缩)地址:

'/^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$/iD'

评论

8赞 Gyuri 12/6/2011
尽管验证 ip-s 可以按照 Frank Krueger 的建议完成,但这个解决方案是真正回答这个问题的解决方案(尽管我还没有完全测试它),并且如果你有很多 IP-s,你想要在语法上测试并可能在一行文本中匹配,你不能使用 IP 验证技术。
0赞 Diosney 12/4/2012
嗨,我测试了这个正则表达式,但对我不起作用。它说 D 是一个无效的标志,当我删除它时,它说“SyntaxError:无效的量词”
3赞 Michael 12/5/2012
JavaScript 实现了 Perl 样式正则表达式的一个子集,而不是整个 PCRE。如果没有PCRE的一些高级功能,我的正则表达式将无法工作。
2赞 sarat 5/7/2013
这在 C 中为我提供了例外#
2赞 pmarreck 10/21/2017
失败的测试用例:FE80:0000:0000:0000:0202:B3FF:FE1E:8329 在此日期使用最新版本的 Elixir,它在下面使用 PCRE。
1赞 user463639 10/1/2010 #7

在 Java 中,您可以使用库类:sun.net.util.IPAddressUtil

IPAddressUtil.isIPv6LiteralAddress(iPaddress);

评论

3赞 David Kocher 5/19/2015
sun.net.* 是私有 API。
9赞 janCoffee 4/6/2011 #8

此正则表达式将根据 GNU C++ 正则表达式实现匹配有效的 IPv6 和 IPv4 地址,并使用 REGULAR EXTENDED 模式:

"^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}))|:)))(%.+)?\s*$"
1赞 Ahamx 1/17/2013 #9

使用 Ruby?试试这个:

/^(((?=.*(::))(?!.*\3.+\3))\3?|[\dA-F]{1,4}:)([\dA-F]{1,4}(\3|:\b)|\2){5}(([\dA-F]{1,4}(\3|:\b|$)|\2){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})\z/i
7赞 Remi Morin 2/19/2013 #10

我不是 Ipv6 专家,但我认为你可以通过这个更容易获得相当不错的结果:

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

回答“是有效的IPv6”对我来说看起来还可以。把它分解成几个部分......没关系。我省略了未指定的地址 (::)因为在我的数据库中没有“未确定的地址”是没有用的。

开头:<--匹配可压缩部分,我们可以将其翻译为:在 2 到 7 个冒号之间,它们之间可能有十六进制数。^([0-9A-Fa-f]{0,4}:){2,7}

后跟:<-- 十六进制数(前导 0 省略) 或 <-- IPv4 地址[0-9A-Fa-f]{1,4}$((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}

评论

1赞 xebeche 6/12/2013
+1 表示实际上坚持 OP 问题并呈现一个相对漂亮的正则表达式,这在某种程度上是有效的。
2赞 lsalamon 8/12/2014
这与“::1”不匹配
0赞 Remi Morin 11/5/2014
哼?在 java 正则表达式语法中,它确实匹配:start() = 0, end() = 3 group(0) = "::1" group(1) = ":" group(2) = "1" group(3) = "null" group(4) = "null" group(5) = "null"
0赞 Remi Morin 4/7/2015
在其他地方有人通知我我的正则表达式有问题,压缩部分“::”只能出现一次。所以“::1::2”将与我的正则表达式匹配,但它不是有效的 IPV6。第二个正则表达式可以验证这种情况。完整的建议是使用有状态解析器进行验证。我同意生成的代码将更易于阅读和维护(并且有人可能已经在某个地方的开源中对其进行了编码)。
0赞 whtyger 7/20/2022
IPv4 正则表达式也不完美。例如,将与它匹配。即任何带有尾随点的地址。1.1.1.1.
4赞 JinnKo 4/13/2013 #11

一个简单的正则表达式可以匹配,但我不建议进行任何形式的验证:

([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}

请注意,这与地址中任何位置的压缩相匹配,尽管它与环回地址 ::1 不匹配。我发现这是一个合理的折衷方案,以保持正则表达式的简单性。

我成功地在 iTerm2 智能选择规则中使用它来四键式 IPv6 地址。

评论

4赞 xebeche 6/12/2013
你的意思是,不是!另请注意,您不包括点分四边形表示法。A-FA-Z
0赞 whtyger 7/20/2022
它将与类似 .可悲的是,没有简单的方法来实现压缩的 IPv6 地址。1::2::3::4::5::6::7::8
0赞 Arnie97 6/26/2023
它匹配无效地址,但不能匹配有效地址。1::2::32a11::
-2赞 Harry 7/24/2013 #12

如果您只想要普通的 IP-s(没有斜杠),请在此处:

^(?:[0-9a-f]{1,4}(?:::)?){0,7}::[0-9a-f]+$

我将其用于主机文件编辑器应用程序中的语法高亮。作为魅力。

评论

0赞 KillianDS 7/24/2013
这不可能像样地工作,它无法将单个 ipv6 地址与其中的单个冒号匹配,您的所有匹配项都在双冒号上,并且您明确要求最后一个组使用双冒号,摘要可以在任何地方发生......。
0赞 Harry 7/24/2013
(?:[0-9a-f]{1,4}(?:::?){0,7}::?[0-9a-f]{1,4}
0赞 KillianDS 7/24/2013
仍然是错误的,但即便如此,您最终还是会重复 JinnKo 的答案,这对于简单的目的来说已经足够好了,但仍然有缺陷(不捕获双重汇总,也不允许虚线四边形,也不允许 localhost,也不允许 :: 终止,...
317赞 David M. Syzdek 7/26/2013 #13

我无法得到 Mystic @Factor 的答案来使用 POSIX 正则表达式,所以我写了一个适用于 POSIX 正则表达式和 PERL 正则表达式的答案。

它应该匹配:

IPv6 正则表达式:

(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

为了便于阅读,下面是上述正则表达式在主要 OR 点处拆分为单独的行:

# IPv6 RegEx
(
([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|          # 1:2:3:4:5:6:7:8
([0-9a-fA-F]{1,4}:){1,7}:|                         # 1::                              1:2:3:4:5:6:7::
([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|         # 1::8             1:2:3:4:5:6::8  1:2:3:4:5:6::8
([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|  # 1::7:8           1:2:3:4:5::7:8  1:2:3:4:5::8
([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|  # 1::6:7:8         1:2:3:4::6:7:8  1:2:3:4::8
([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|  # 1::5:6:7:8       1:2:3::5:6:7:8  1:2:3::8
([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|  # 1::4:5:6:7:8     1:2::4:5:6:7:8  1:2::8
[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|       # 1::3:4:5:6:7:8   1::3:4:5:6:7:8  1::8  
:((:[0-9a-fA-F]{1,4}){1,7}|:)|                     # ::2:3:4:5:6:7:8  ::2:3:4:5:6:7:8 ::8       ::     
fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|     # fe80::7:8%eth0   fe80::7:8%1     (link-local IPv6 addresses with zone index)
::(ffff(:0{1,4}){0,1}:){0,1}
((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}
(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|          # ::255.255.255.255   ::ffff:255.255.255.255  ::ffff:0:255.255.255.255  (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
([0-9a-fA-F]{1,4}:){1,4}:
((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}
(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])           # 2001:db8:3:4::192.0.2.33  64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
)

# IPv4 RegEx
((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])

为了使上述内容更易于理解,以下“伪”代码复制了上述内容:

IPV4SEG  = (25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])
IPV4ADDR = (IPV4SEG\.){3,3}IPV4SEG
IPV6SEG  = [0-9a-fA-F]{1,4}
IPV6ADDR = (
           (IPV6SEG:){7,7}IPV6SEG|                # 1:2:3:4:5:6:7:8
           (IPV6SEG:){1,7}:|                      # 1::                                 1:2:3:4:5:6:7::
           (IPV6SEG:){1,6}:IPV6SEG|               # 1::8               1:2:3:4:5:6::8   1:2:3:4:5:6::8
           (IPV6SEG:){1,5}(:IPV6SEG){1,2}|        # 1::7:8             1:2:3:4:5::7:8   1:2:3:4:5::8
           (IPV6SEG:){1,4}(:IPV6SEG){1,3}|        # 1::6:7:8           1:2:3:4::6:7:8   1:2:3:4::8
           (IPV6SEG:){1,3}(:IPV6SEG){1,4}|        # 1::5:6:7:8         1:2:3::5:6:7:8   1:2:3::8
           (IPV6SEG:){1,2}(:IPV6SEG){1,5}|        # 1::4:5:6:7:8       1:2::4:5:6:7:8   1:2::8
           IPV6SEG:((:IPV6SEG){1,6})|             # 1::3:4:5:6:7:8     1::3:4:5:6:7:8   1::8
           :((:IPV6SEG){1,7}|:)|                  # ::2:3:4:5:6:7:8    ::2:3:4:5:6:7:8  ::8       ::       
           fe80:(:IPV6SEG){0,4}%[0-9a-zA-Z]{1,}|  # fe80::7:8%eth0     fe80::7:8%1  (link-local IPv6 addresses with zone index)
           ::(ffff(:0{1,4}){0,1}:){0,1}IPV4ADDR|  # ::255.255.255.255  ::ffff:255.255.255.255  ::ffff:0:255.255.255.255 (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
           (IPV6SEG:){1,4}:IPV4ADDR               # 2001:db8:3:4::192.0.2.33  64:ff9b::192.0.2.33 (IPv4-Embedded IPv6 Address)
           )

我在 GitHub 上发布了一个测试正则表达式的脚本:https://gist.github.com/syzdek/6086792

评论

3赞 Kentzo 3/13/2014
您的 IPv4 正则表达式与 IP 不匹配,例如127.000.000.001
30赞 par 7/26/2014
IPv4 段不应包含前导零。如果存在前导零,则 IPv4 段应以八进制解释。因此,上面IPV4SEG不允许“000”是正确的。但是,它确实允许“00”,但它不应该。
5赞 Capaj 2/9/2015
在浏览器中没有像我预期的那样为我工作。甚至验证了 reg.test('3zzzzffe:1900:4545:3:200:f8ff:fe21:67cf'),这显然不是有效的 IPv6 地址。这里的正则表达式结果要好得多:nbviewer.ipython.org/github/rasbt/python_reference/blob/master/......
8赞 user2831628 3/25/2015
梦幻般的 IPv6 正则表达式。在链接本地部分发现了一个小错误。你有它应该是类似的东西,以及它应该是类似的东西fe80[fF][eE]80ffff[fF]{4}
6赞 Natix 12/15/2015
+1 表示,如果您小心并格式化正则表达式,则正则表达式可以(以与任何源代码相同的方式)实际可读。
5赞 user2623580 7/27/2013 #14

小心!在 Java 中,使用 InetAddress 和相关类(Inet4Address、Inet6Address、URL)可能会涉及网络交易!例如,DNS解析(URL.equals,来自字符串的InetAddress!此呼叫可能需要很长时间并且会阻止!

对于IPv6,我有这样的东西。当然,这并不能处理 IPv6 中非常微妙的细节,例如区域索引只允许在某些类的 IPv6 地址上使用。而且这个正则表达式不是为组捕获而写的,它只是一种“匹配”类型的正则表达式。

S- IPv6 段 =[0-9a-f]{1,4}

I- IPv4 =(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})

原理图(第一部分匹配带有 IPv4 后缀的 IPv6 地址,第二部分匹配 IPv6 地址,最后一部分匹配区域索引):

(
(
::(S:){0,5}|
S::(S:){0,4}|
(S:){2}:(S:){0,3}|
(S:){3}:(S:){0,2}|
(S:){4}:(S:)?|
(S:){5}:|
(S:){6}
)
I

|

:(:|(:S){1,7})|
S:(:|(:S){1,6})|
(S:){2}(:|(:S){1,5})|
(S:){3}(:|(:S){1,4})|
(S:){4}(:|(:S){1,3})|
(S:){5}(:|(:S){1,2})|
(S:){6}(:|(:S))|
(S:){7}:|
(S:){7}S
)

(?:%[0-9a-z]+)?

这里是可能正则表达式(不区分大小写,用行的开头/结尾等需要的内容括起来):

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

:(?::|(?::[0-9a-f]{1,4}){1,7})|
[0-9a-f]{1,4}:(?::|(?::[0-9a-f]{1,4}){1,6})|
(?:[0-9a-f]{1,4}:){2}(?::|(?::[0-9a-f]{1,4}){1,5})|
(?:[0-9a-f]{1,4}:){3}(?::|(?::[0-9a-f]{1,4}){1,4})|
(?:[0-9a-f]{1,4}:){4}(?::|(?::[0-9a-f]{1,4}){1,3})|
(?:[0-9a-f]{1,4}:){5}(?::|(?::[0-9a-f]{1,4}){1,2})|
(?:[0-9a-f]{1,4}:){6}(?::|(?::[0-9a-f]{1,4}))|
(?:[0-9a-f]{1,4}:){7}:|
(?:[0-9a-f]{1,4}:){7}[0-9a-f]{1,4}
)

(?:%[0-9a-z]+)?

评论

0赞 Mecki 11/13/2021
仅当您强制它从行的开头到结尾匹配并且该行仅包含 IPv6 地址时才有效,否则它可能只匹配部分地址;请参阅此处 regex101.com/r/QZJu0x/1
0赞 Wireblue 11/19/2013 #15

对于PHP 5.2+用户来说效果很好。filter_var

我知道这并不能回答最初的问题(特别是正则表达式解决方案),但我发布此内容是希望将来可以帮助其他人。

$is_ip4address = (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== FALSE);
$is_ip6address = (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== FALSE);
0赞 Chris 12/6/2013 #16

这适用于 IPv4 和 IPv6:

^(([0-9a-f]{0,4}:){1,7}[0-9a-f]{1,4}|([0-9]{1,3}\.){3}[0-9]{1,3})$

评论

2赞 nhahtdh 9/3/2015
它将无效地址与 的 2 个实例进行匹配。例如::2404:6800::4003:c02::8a
0赞 Ryan Williams 1/22/2018
匹配无效的 IPv4 666.666.666.666
-1赞 Phil L. 2/23/2014 #17

您可以使用我为此目的制作的 ipextract shell 工具。它们基于 regexp 和 grep。

用法:

$ ifconfig | ipextract6
fe80::1%lo0
::1
fe80::7ed1:c3ff:feec:dee1%en0
2赞 Steve Buzonas 3/11/2014 #18

查看其他答案中包含的模式,有许多好的模式可以通过引用组和利用前瞻来改进。下面是一个自我引用模式的示例,如果有必要,我会在 PHP 中使用它:

^(?<hgroup>(?<hex>[[:xdigit:]]{0,4}) # grab a sequence of up to 4 hex digits
                                     # and name this pattern for usage later
     (?<!:::):{1,2})                 # match 1 or 2 ':' characters
                                     # as long as we can't match 3
 (?&hgroup){1,6} # match our hex group 1 to 6 more times
 (?:(?:
    # match an ipv4 address or
    (?<dgroup>2[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(?&dgroup)
    # match our hex group one last time
    |(?&hex))$

注意:PHP有一个内置的过滤器,这将是一个比这更好的解决方案 模式。

Regex101分析

0赞 user1977022 9/30/2014 #19

这是我想出的,使用一些前瞻和命名组。这当然只是 IPv6,但如果你想添加 IPv4,它不应该干扰其他模式:

(?=([0-9a-f]+(:[0-9a-f])*)?(?P<wild>::)(?!([0-9a-f]+:)*:))(::)?([0-9a-f]{1,4}:{1,2}){0,6}(?(wild)[0-9a-f]{0,4}|[0-9a-f]{1,4}:[0-9a-f]{1,4})
1赞 Nuh Metin Güler 2/3/2015 #20

很难找到适用于所有 IPv6 情况的正则表达式。它们通常难以维护,不易读,并可能导致性能问题。因此,我想分享我开发的替代解决方案:独立于 IPv4 的 IPv6 正则表达式 (RegEx)

现在你可能会问“这个方法只找到IPv6,我怎么能在文本或文件中找到IPv6?这里也是解决此问题的方法。

注意:如果不想在 .NET 中使用 IPAddress 类,也可以将其替换为我的方法。它还涵盖了映射的 IPv4 和特殊情况,而 IPAddress 不包括。

class IPv6
{
    public List<string> FindIPv6InFile(string filePath)
    {
        Char ch;
        StringBuilder sbIPv6 = new StringBuilder();
        List<string> listIPv6 = new List<string>();
        StreamReader reader = new StreamReader(filePath);
        do
        {
            bool hasColon = false;
            int length = 0;

            do
            {
                ch = (char)reader.Read();

                if (IsEscapeChar(ch))
                    break;

                //Check the first 5 chars, if it has colon, then continue appending to stringbuilder
                if (!hasColon && length < 5)
                {
                    if (ch == ':')
                    {
                        hasColon = true;
                    }
                    sbIPv6.Append(ch.ToString());
                }
                else if (hasColon) //if no colon in first 5 chars, then dont append to stringbuilder
                {
                    sbIPv6.Append(ch.ToString());
                }

                length++;

            } while (!reader.EndOfStream);

            if (hasColon && !listIPv6.Contains(sbIPv6.ToString()) && IsIPv6(sbIPv6.ToString()))
            {
                listIPv6.Add(sbIPv6.ToString());
            }

            sbIPv6.Clear();

        } while (!reader.EndOfStream);
        reader.Close();
        reader.Dispose();

        return listIPv6;
    }

    public List<string> FindIPv6InText(string text)
    {
        StringBuilder sbIPv6 = new StringBuilder();
        List<string> listIPv6 = new List<string>();

        for (int i = 0; i < text.Length; i++)
        {
            bool hasColon = false;
            int length = 0;

            do
            {
                if (IsEscapeChar(text[length + i]))
                    break;

                //Check the first 5 chars, if it has colon, then continue appending to stringbuilder
                if (!hasColon && length < 5)
                {
                    if (text[length + i] == ':')
                    {
                        hasColon = true;
                    }
                    sbIPv6.Append(text[length + i].ToString());
                }
                else if (hasColon) //if no colon in first 5 chars, then dont append to stringbuilder
                {
                    sbIPv6.Append(text[length + i].ToString());
                }

                length++;

            } while (i + length != text.Length);

            if (hasColon && !listIPv6.Contains(sbIPv6.ToString()) && IsIPv6(sbIPv6.ToString()))
            {
                listIPv6.Add(sbIPv6.ToString());
            }

            i += length;
            sbIPv6.Clear();
        }

        return listIPv6;
    }

    bool IsEscapeChar(char ch)
    {
        if (ch != ' ' && ch != '\r' && ch != '\n' && ch!='\t')
        {
            return false;
        }

        return true;
    }

    bool IsIPv6(string maybeIPv6)
    {
        IPAddress ip;
        if (IPAddress.TryParse(maybeIPv6, out ip))
        {
            return ip.AddressFamily == AddressFamily.InterNetworkV6;
        }
        else
        {
            return false;
        }
    }

}
1赞 user4604205 2/25/2015 #21

InetAddressUtils定义了所有模式。我最终直接使用了他们的模式,并将其粘贴到此处以供参考:

private static final String IPV4_BASIC_PATTERN_STRING =
        "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" + // initial 3 fields, 0-255 followed by .
         "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"; // final field, 0-255

private static final Pattern IPV4_PATTERN =
    Pattern.compile("^" + IPV4_BASIC_PATTERN_STRING + "$");

private static final Pattern IPV4_MAPPED_IPV6_PATTERN = // TODO does not allow for redundant leading zeros
        Pattern.compile("^::[fF]{4}:" + IPV4_BASIC_PATTERN_STRING + "$");

private static final Pattern IPV6_STD_PATTERN =
    Pattern.compile(
            "^[0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4}){7}$");

private static final Pattern IPV6_HEX_COMPRESSED_PATTERN =
    Pattern.compile(
            "^(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)" + // 0-6 hex fields
             "::" +
             "(([0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){0,5})?)$"); // 0-6 hex fields 

评论

0赞 Patrick Mevzek 10/21/2020
最后一个正则表达式允许 6 个十六进制字段加上 '::' 加上 6 个其他十六进制字段,这将使它有点太长 IPv6 地址......
2赞 OliverKK 10/6/2015 #22

Scala 中,使用众所周知的 Apache Commons 验证器。

http://mvnrepository.com/artifact/commons-validator/commons-validator/1.4.1

libraryDependencies += "commons-validator" % "commons-validator" % "1.4.1"


import org.apache.commons.validator.routines._

/**
 * Validates if the passed ip is a valid IPv4 or IPv6 address.
 *
 * @param ip The IP address to validate.
 * @return True if the passed IP address is valid, false otherwise.
 */  
 def ip(ip: String) = InetAddressValidator.getInstance().isValid(ip)

按照该方法的测试:ip(ip: String)

"The `ip` validator" should {
  "return false if the IPv4 is invalid" in {
    ip("123") must beFalse
    ip("255.255.255.256") must beFalse
    ip("127.1") must beFalse
    ip("30.168.1.255.1") must beFalse
    ip("-1.2.3.4") must beFalse
  }

  "return true if the IPv4 is valid" in {
    ip("255.255.255.255") must beTrue
    ip("127.0.0.1") must beTrue
    ip("0.0.0.0") must beTrue
  }

  //IPv6
  //@see: http://www.ronnutter.com/ipv6-cheatsheet-on-identifying-valid-ipv6-addresses/
  "return false if the IPv6 is invalid" in {
    ip("1200::AB00:1234::2552:7777:1313") must beFalse
  }

  "return true if the IPv6 is valid" in {
    ip("1200:0000:AB00:1234:0000:2552:7777:1313") must beTrue
    ip("21DA:D3:0:2F3B:2AA:FF:FE28:9C5A") must beTrue
  }
}

评论

0赞 Ron Maupin 11/3/2015
有趣的是,它声称检查它是否是一个有效的地址,“验证传递的 ip 是否是有效的 IPv4 或 IPv6 地址”,但它实际上只检查它是否被格式化为有效地址。例如,是 IPv6 地址的有效格式,但它不是测试方法返回的有效 IPv6 地址。我敢打赌它认为是一个有效的 IPv4 地址。1200:0000:AB00:1234:0000:2552:7777:1313241.54.113.65
16赞 Rohit Malgaonkar 5/21/2016 #23

这也会捕获 loopback(::1) 和 ipv6 地址。 将 {} 更改为 +,并将 : 放在第一个方括号内。

([a-f0-9:]+:+)+[a-f0-9]+

使用 ifconfig -a 输出 http://regexr.com/ 进行测试

Unix 或 Mac OSx 终端 o 选项仅返回匹配的输出(ipv6),包括 ::1

ifconfig -a | egrep -o '([a-f0-9:]+:+)+[a-f0-9]+'

获取所有 IP 地址(IPv4 或 IPv6)并在 unix OSx 术语上打印匹配项

ifconfig -a | egrep -o '([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) | (([a-f0-9:]+:+)+[a-f0-9]+)'

评论

1赞 Noam Manos 1/8/2019
我喜欢简单。这最终对我有用:ip a | grep -Po '[\w:]+:+[\w:]+'
0赞 Soumya Kanti 1/8/2019
幽默值得赞赏!
0赞 Peter 5/22/2020
当我运行 ipconfig /all 时,我的 ip 地址以 %10 结尾,这个表达式与这部分不匹配?
0赞 Arnie97 6/26/2023
这与 ,这是一个有效的 IPv6 地址(实际上是公共 DNS 服务器)。2a11::
-1赞 Carlos Velazquez 6/19/2016 #24

试试这个小小的单行本。它应仅匹配有效的未压缩/压缩 IPv6 地址(无 IPv4 混合)

/(?!.*::.*::)(?!.*:::.*)(?!:[a-f0-9])((([a-f0-9]{1,4})?[:](?!:)){7}|(?=(.*:[:a-f0-9]{1,4}::|^([:a-f0-9]{1,4})?::))(([a-f0-9]{1,4})?[:]{1,2}){1,6})[a-f0-9]{1,4}/

评论

0赞 Ron Maupin 6/19/2016
实际上,有效的 IPv6 地址包括未压缩、压缩、未压缩混合和压缩混合。实际上,要实际匹配 IPv6 地址的任何有效文本表示形式,需要的要多得多。
2赞 Bill Lipa 8/31/2016 #25

根据您的需求,近似值如下:

[0-9a-f:]+

可能就足够了(例如,与简单的日志文件 grepping 一样。

2赞 Mike Wilmes 10/4/2016 #26

我使用 python 生成了以下内容,并使用 re 模块。前瞻断言可确保地址中显示正确数量的点或冒号。它不支持 IPv6 表示法的 IPv4。

pattern = '^(?=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$)(?:(?:25[0-5]|[12][0-4][0-9]|1[5-9][0-9]|[1-9]?[0-9])\.?){4}$|(?=^(?:[0-9a-f]{0,4}:){2,7}[0-9a-f]{0,4}$)(?![^:]*::.+::[^:]*$)(?:(?=.*::.*)|(?=\w+:\w+:\w+:\w+:\w+:\w+:\w+:\w+))(?:(?:^|:)(?:[0-9a-f]{4}|[1-9a-f][0-9a-f]{0,3})){0,8}(?:::(?:[0-9a-f]{1,4}(?:$|:)){0,6})?$'
result = re.match(pattern, ip)
if result: result.group(0)
0赞 Master James 4/9/2017 #27

只需匹配来自包含方括号的源的本地。我知道它没有那么全面,但在 javascript 中,其他问题很难追踪,主要是无法正常工作的问题,所以这似乎得到了我现在需要的东西。也不需要额外的大写字母 A-F。

^\[([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})(\:{1,2})([0-9a-fA-F]{1,4})\]

Jinnko 的版本简化了,我明白了。

0赞 Alexandre Fenyo 7/24/2017 #28

如上所述,获取验证解析器的 IPv6 文本表示的另一种方法是使用编程。这是一个完全符合 RFC-4291 和 RFC-5952 的产品。我用 ANSI C 编写了这段代码(适用于 GCC,在 Linux 上通过了测试 - 在 clang 上通过,在 FreeBSD 上通过了测试)。因此,它只依赖于 ANSI C 标准库,因此它可以在任何地方编译(我已经用它在 FreeBSD 的内核模块中用于 IPv6 解析)。

// IPv6 textual representation validating parser fully compliant with RFC-4291 and RFC-5952
// BSD-licensed / Copyright 2015-2017 Alexandre Fenyo

#include <string.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

typedef enum { false, true } bool;

static const char hexdigits[] = "0123456789abcdef";
static int digit2int(const char digit) {
  return strchr(hexdigits, digit) - hexdigits;
}

// This IPv6 address parser handles any valid textual representation according to RFC-4291 and RFC-5952.
// Other representations will return -1.
//
// note that str input parameter has been modified when the function call returns
//
// parse_ipv6(char *str, struct in6_addr *retaddr)
// parse textual representation of IPv6 addresses
// str:     input arg
// retaddr: output arg
int parse_ipv6(char *str, struct in6_addr *retaddr) {
  bool compressed_field_found = false;
  unsigned char *_retaddr = (unsigned char *) retaddr;
  char *_str = str;
  char *delim;

  bzero((void *) retaddr, sizeof(struct in6_addr));
  if (!strlen(str) || strchr(str, ':') == NULL || (str[0] == ':' && str[1] != ':') ||
      (strlen(str) >= 2 && str[strlen(str) - 1] == ':' && str[strlen(str) - 2] != ':')) return -1;

  // convert transitional to standard textual representation
  if (strchr(str, '.')) {
    int ipv4bytes[4];
    char *curp = strrchr(str, ':');
    if (curp == NULL) return -1;
    char *_curp = ++curp;
    int i;
    for (i = 0; i < 4; i++) {
      char *nextsep = strchr(_curp, '.');
      if (_curp[0] == '0' || (i < 3 && nextsep == NULL) || (i == 3 && nextsep != NULL)) return -1;
      if (nextsep != NULL) *nextsep = 0;
      int j;
      for (j = 0; j < strlen(_curp); j++) if (_curp[j] < '0' || _curp[j] > '9') return -1;
      if (strlen(_curp) > 3) return -1;
      const long val = strtol(_curp, NULL, 10);
      if (val < 0 || val > 255) return -1;
      ipv4bytes[i] = val;
      _curp = nextsep + 1;
    }
    sprintf(curp, "%x%02x:%x%02x", ipv4bytes[0], ipv4bytes[1], ipv4bytes[2], ipv4bytes[3]);
  }

  // parse standard textual representation
  do {
    if ((delim = strchr(_str, ':')) == _str || (delim == NULL && !strlen(_str))) {
      if (delim == str) _str++;
      else if (delim == NULL) return 0;
      else {
        if (compressed_field_found == true) return -1;
        if (delim == str + strlen(str) - 1 && _retaddr != (unsigned char *) (retaddr + 1)) return 0;
        compressed_field_found = true;
        _str++;
        int cnt = 0;
        char *__str;
        for (__str = _str; *__str; ) if (*(__str++) == ':') cnt++;
        unsigned char *__retaddr = - 2 * ++cnt + (unsigned char *) (retaddr + 1);
        if (__retaddr <= _retaddr) return -1;
        _retaddr = __retaddr;
      }
    } else {
      char hexnum[4] = "0000";
      if (delim == NULL) delim = str + strlen(str);
      if (delim - _str > 4) return -1;
      int i;
      for (i = 0; i < delim - _str; i++)
        if (!isxdigit(_str[i])) return -1;
        else hexnum[4 - (delim - _str) + i] = tolower(_str[i]);
      _str = delim + 1;
      *(_retaddr++) = (digit2int(hexnum[0]) << 4) + digit2int(hexnum[1]);
      *(_retaddr++) = (digit2int(hexnum[2]) << 4) + digit2int(hexnum[3]);
    }
  } while (_str < str + strlen(str));
  return 0;
}
4赞 Sean F 12/18/2017 #29

当您考虑具有嵌入式 ipv4 的地址和压缩的地址时,ipv6 的正则表达式可能会变得非常棘手,正如您从其中一些答案中看到的那样。

开源 IPAddress Java 库将验证 IPv6 和 IPv4 的所有标准表示形式,并且还支持前缀长度(以及此类验证)。免责声明:我是该图书馆的项目经理。

代码示例:

        try {
            IPAddressString str = new IPAddressString("::1");
            IPAddress addr = str.toAddress();
            if(addr.isIPv6() || addr.isIPv6Convertible()) {
                IPv6Address ipv6Addr = addr.toIPv6();
            }
            //use address
        } catch(AddressStringException e) {
            //e.getMessage has validation error
        }
5赞 Jitendra Gosavi 5/17/2018 #30

以下正则表达式仅适用于 IPv6。组 1 与 IP 匹配。

(([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4})

评论

0赞 David L. 1/28/2019
+1 并不总是需要有一个人类无法理解的完美超级复杂正则表达式。我将使用这个,因为我了解它的作用,就我而言,我可以确定,如果我得到了类似于有效 ipv6 的东西,那么它就是有效的 ipv6。
7赞 James 4/24/2019
这与说:fe80::1 或 2342:32fd::2d32 不匹配
0赞 Kaymaz 10/21/2020
正则表达式匹配:2020-09-09 16:36:10,978 INFO 成功:nginx 进入 RUNNING 状态,进程已保持 > 秒 (startsecs) 以上。
0赞 grin 3/5/2021
@Kaymaz在正则表达式中使用一些上下文。压缩不能轻易地进行正则表达式,正如您在顶部回复中看到的那样。
0赞 Yashwant Mahawar 10/7/2021
(([0-9a-fA-f]{0,4}:){7}[0-9a-fA-F]{0,4}){1,7} 它违反了 IPv6 规则。替换为 {7}