如何将IPv6地址与Perl正则表达式匹配?

mnowg1ta  于 2022-11-15  发布在  Perl
关注(0)|答案(9)|浏览(144)

所以我需要匹配一个可能有也可能没有掩码的ipv6地址,不幸的是我不能只使用一个库来解析字符串。
在本例中,掩码位非常简单:

(?:\/\d{1,3})?$/

困难的部分是不同格式的ipv6地址。它需要匹配::beef,beef::,beef::beef,等等。
最新消息:我快到了。

/^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:([a-f0-9]{1,4}\:){1,6}?[a-f0-9]{1,4})(\/\d{1,3})?$/i

在这种情况下,我只能使用perl的regex。

8oomwypt

8oomwypt1#

This包含Regexp::Common的修补程序,演示了完整、准确、经过测试的IPv6正则表达式。它是IPv6语法的直接翻译。Regexp::IPv6也是准确的。
更重要的是,它包含了一个测试套件。用正则表达式运行它会发现你还差得远。19次中有10次错过。12次中有1次误报。IPv6包含了很多特殊的速记,这使得它很容易出现微妙的错误。
要了解IPv6地址的组成部分,最好阅读RFC 3986第3.2.2节。

gstyhher

gstyhher2#

你说不能只使用一个库是什么意思?模块怎么样?Regexp::IPv6会给予你你所需要的。

nuypyhwy

nuypyhwy3#

我不是IPv6Maven,但是请相信我,用一个非常简单的正则表达式(比如您建议的正则表达式)来匹配(更不用说验证)IPv6地址并不容易。有许多简写和各种约定来组合地址和端口,这里仅举一个例子。其中一个简写是您可以将0:0:0:0:0:0:0:1写为::1,但还有更多。如果您懂德语,我建议您看一下第11届德语Perl研讨会上的Steffen Ullrich's talk幻灯片。
你说你不能使用一个库,但是如果你打算重新发明这个库的整个复杂性,那么你也可以把它逐字地导入到你的项目中。

ecbunoof

ecbunoof4#

这基本上是可行的...

^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$

缺点:::类病例未正确处理

qlfbtfca

qlfbtfca5#

请尝试:

/^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z/ai

发件人:http://home.deds.nl/~aeron/regex/

yv5phkfx

yv5phkfx6#

试试看:

^([0-9a-fA-F]{4}|0)(\:([0-9a-fA-F]{4}|0)){7}$

Regular Expression Library: IPv6 address开始
您还应阅读以下内容:A Regular Expression for IPv6 Addresses

zmeyuzjn

zmeyuzjn7#

如果您需要在perl中检查字符串是否为IPv6地址,可以尝试以下操作:

if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$1") };
mrphzbgm

mrphzbgm8#

下面是我设法找到的适用于所有IPv6示例的方法:

/^\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]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){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]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){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]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){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]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){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]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/

在使用前请确保它是一行。它可以在以下位置找到:
https://community.helpsystems.com/forums/intermapper/miscellaneous-topics/5acc4fcf-fa83-e511-80cf-0050568460e4
从问题页面、社区页面和维基百科网站的所有示例中进行验证,请访问:
https://en.wikipedia.org/wiki/IPv6
使用的验证工具为以下工具:
https://regex101.com/

2q5ifsrm

2q5ifsrm9#

这是一个综合性的IPv6正则表达式,用于测试所有有效的IPv6文本表示法(expanded、compressed、expanded-mixed、compressed mixed)以及可选的前缀长度。它还将各个部分捕获到捕获组中。可以通过在捕获组的左括号后面放置?:来跳过捕获组。

^# Anchor
(# BEGIN Compressed-mixed                                       *** Group 1 ***
  (# BEGIN Hexadecimal Notation                                 *** Group 2 ***
    (?:
      (?:[0-9A-F]{1,4}:){5}[0-9A-F]{1,4}            # No ::
    | (?:[0-9A-F]{1,4}:){4}:[0-9A-F]{1,4}           # 4::1
    | (?:[0-9A-F]{1,4}:){3}(?::[0-9A-F]{1,4}){1,2}  # 3::2
    | (?:[0-9A-F]{1,4}:){2}(?::[0-9A-F]{1,4}){1,3}  # 2::3
    | [0-9A-F]{1,4}:(?::[0-9A-F]{1,4}){1,4}         # 1::4
    | (?:[0-9A-F]{1,4}:){1,5}                       # End ::
    | :(?::[0-9A-F]{1,4}){1,5}                      # Start ::
    | :                                             # Only ::
    ) :
  )# END Hexadecimal Notation
  (# BEGIN Dotted-decimal Notation                              *** Group 3 ***
    (25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\. # 0 to 255. *** Group 4 ***
    (25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\. # 0 to 255. *** Group 5 ***
    (25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\. # 0 to 255. *** Group 6 ***
    (25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])   # 0 to 255  *** Group 7 ***
  )# END Dotted-decimal Notation
)# END Compressed-mixed
|
(# BEGIN Compressed                                             *** Group 8 ***
  (?:# BEGIN Hexadecimal Notation
    (?:[0-9A-F]{1,4}:){7}[0-9A-F]{1,4}              # No ::
  | (?:[0-9A-F]{1,4}:){6}:[0-9A-F]{1,4}             # 6::1
  | (?:[0-9A-F]{1,4}:){5}(?::[0-9A-F]{1,4}){1,2}    # 5::2
  | (?:[0-9A-F]{1,4}:){4}(?::[0-9A-F]{1,4}){1,3}    # 4::3
  | (?:[0-9A-F]{1,4}:){3}(?::[0-9A-F]{1,4}){1,4}    # 3::4
  | (?:[0-9A-F]{1,4}:){2}(?::[0-9A-F]{1,4}){1,5}    # 2::5
  | [0-9A-F]{1,4}:(?::[0-9A-F]{1,4}){1,6}           # 1::6
  | (?:[0-9A-F]{1,4}:){1,7}:                        # End ::
  | :(?::[0-9A-F]{1,4}){1,7}                        # Start ::
  | ::                                              # Only ::
  )  # END Hexadecimal Notation
)# END Compressed
(?:# BEGIN Optional Length
     /(12[0-8]|1[0-1][0-9]|[1-9]?[0-9])           # /0 to /128  *** Group 9 ***
)? # END Optional Length
$# Anchor

附加IPv4正则表达式:

^# Anchor
(?:# BEGIN Dotted-decimal Notation
  (25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\. # 0 to 255. *** Group 1 ***
  (25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\. # 0 to 255. *** Group 2 ***
  (25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\. # 0 to 255. *** Group 3 ***
  (25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])   # 0 to 255  *** Group 4 ***
)  # END Dotted-decimal Notation
(?:# BEGIN Optional Length
     /(3[0-2]|[1-2]?[0-9])                      # /0 to /32   *** Group 5 ***
)?  # END Optional Length
$# Anchor

相关问题