regex 匹配所有有效格式IPv6地址的正则表达式

kqlmhetl  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(184)
    • 乍一看,我承认这个问题看起来像是这个问题和任何其他相关问题的重复:**

与有效IPv6地址匹配的正则表达式
事实上,这个问题的答案几乎回答了我的问题,但并不完全。
这个问题的代码我有问题,但最成功的,如下所示:

private string RemoveIPv6(string sInput)
{
    string pattern = @"(([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]))";
    //That is one looooong regex! From: https://stackoverflow.com/a/17871737/3472690
    //if (IsCompressedIPv6(sInput))
      //  sInput = UncompressIPv6(sInput);
    string output = Regex.Replace(sInput, pattern, "");
    if (output.Contains("Addresses"))
        output = output.Substring(0, "Addresses: ".Length);

    return output;
}

这个答案中提供的正则表达式模式David M. Syzdek's Answer的问题是,它不匹配,并删除了我扔给它的IPv6地址的完整形式。
我使用regex模式主要是将字符串中的IPv6地址替换为空白或空值。
例如,

Addresses:  2404:6800:4003:c02::8a

还有...

Addresses:  2404:6800:4003:804::200e

最后

Addresses:  2001:4998:c:a06::2:4008

所有这些要么没有被正则表达式完全匹配,要么没有被完全匹配。
正则表达式将返回字符串的其余部分,如下所示:

Addresses:  8a

    Addresses:  200e

    Addresses:  2:4008

可以看出,它留下了IPv6地址的残余,由于残余地址采用不同的格式,因此很难检测和删除。下面是regex模式,以便更好地进行分析:

(([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]))

因此,我的问题是,如何更正此正则表达式模式,使其能够匹配,从而允许从不只包含IPv6地址本身的字符串中完全删除任何IPv6地址?

    • 或者**,如何更正我上面提供的代码片段以提供所需的结果?
  • 对于那些可能感到疑惑的人,我从nslookup命令的StandardOutput中获取字符串,并且IPv6地址将始终不同。对于上面的示例,我从"www.example.com"和"www.example.com"中获取这些IPv6地址。* google.com " and " yahoo.com ".*
  • 我没有使用内置函数解析DNS条目是有原因的,我认为这暂时无关紧要,因此我使用nslookup。*
  • 至于调用该函数的代码,如果需要,如下所示:(它本身也是另一个函数/方法,或者更确切地说是其中的一部分)*
string output = "";
string garbagecan = "";
string tempRead = "";
string lastRead = "";
using (StreamReader reader = nslookup.StandardOutput)
{
     while (reader.Peek() != -1)
     {
         if (LinesRead > 3)
         {
             tempRead = reader.ReadLine();
             tempRead = RemoveIPv6(tempRead);

             if (tempRead.Contains("Addresses"))
                 output += tempRead;
             else if (lastRead.Contains("Addresses"))
                 output += tempRead.Trim() + Environment.NewLine;
             else
                 output += tempRead + Environment.NewLine;
             lastRead = tempRead;
         }
         else
             garbagecan = reader.ReadLine();
         LinesRead++;
     }
 }
 return output;

更正后的正则表达式应仅允许删除IPv6地址,而不允许修改IPv4地址。* 将传递给正则表达式的字符串将不包含IPv6地址(es)单独,并且几乎总是包含其他细节,因此,地址将出现在哪个索引处是不可预测的。正则表达式也跳过所有其他IPv6地址后,第一次出现的IPv6地址以及出于某种原因,应该注意。
抱歉,如果有任何遗漏的细节,我会尽我所能,包括他们时,提醒。我也希望工作代码样本,如果可能的话,因为我几乎没有关于正则表达式的知识。

yh2wf1be

yh2wf1be1#

(?:^|(?<=\s))(([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]))(?=\s|$)

使用lookarounds可以强制执行完全匹配,而不是partial匹配。请参阅演示。
https://regex101.com/r/cT0hV4/5

u5rb5r59

u5rb5r592#

(?i)(?<ipv6>(?:[\da-f]{0,4}:){1,7}(?:(?<ipv4>(?:(?:25[0-5]|2[0-4]\d|1?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|1?\d\d?))|[\da-f]{0,4}))

演示:Regex101
Github Repository

相关问题