c# – 与所有有效格式的IPv6地址匹配的正则表达式

前端之家收集整理的这篇文章主要介绍了c# – 与所有有效格式的IPv6地址匹配的正则表达式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
乍一看,我承认这个问题看起来像是这个问题的重复和任何其他相关的问题:

Regular expression that matches valid IPv6 addresses

这个问题实际上有一个答案,几乎回答了我的问题,但不完全.

我遇到的问题的代码,但最成功的代码如下所示:

  1. private string RemoveIPv6(string sInput)
  2. {
  3. 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,6}:[0-9a-fA-F]{1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,3}|([0-9a-fA-F]{1,3}(:[0-9a-fA-F]{1,2}(:[0-9a-fA-F]{1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,6})|:((:[0-9a-fA-F]{1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,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-9a-fA-F]{1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]))";
  4. //That is one looooong regex! From: https://stackoverflow.com/a/17871737/3472690
  5. //if (IsCompressedIPv6(sInput))
  6. // sInput = UncompressIPv6(sInput);
  7. string output = Regex.Replace(sInput,pattern,"");
  8. if (output.Contains("Addresses"))
  9. output = output.Substring(0,"Addresses: ".Length);
  10.  
  11. return output;
  12. }

与本答案David M. Syzdek’s Answer中提供的正则表达式模式有关的问题是,它不匹配并删除我抛出的IPv6地址的完整形式.

我正在使用正则表达式模式主要用空格或空值替换字符串中的IPv6地址.

例如,

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

以及…

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

最后…

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

所有这些都不能被正则表达式完全匹配,或者不能完全匹配.

正则表达式将返回字符串的其余部分,如下所示:

  1. Addresses: 8a
  2.  
  3. Addresses: 200e
  4.  
  5. Addresses: 2:4008

可以看出,由于遗留的格式不同,IPv6地址的遗留问题很难被检测和删除.下面是正则表达式本身,以便更好地分析:

  1. (([0-9a-fA-F]{1,1}[0-9]))

因此,我的问题是,如何纠正这种正则表达式模式,以便可以匹配,从而允许从不仅仅包含IPv6地址本身的字符串中完全删除任何IPv6地址?

或者,我如何更正我提供的代码片段来提供所需的结果?

对于那些可能想知道的人,我从nslookup命令的StandardOutput获取字符串,并且IPv6地址总是不同.对于上面的例子,我从“google.com”和“yahoo.com”获得了这些IPv6地址.

我没有使用内置函数解决DNS条目,这是一个很好的理由,我不认为这一切将会很重要,因此我正在使用nslookup.

对于调用函数代码,如果需要,如下所示:(它本身也是另一个函数/方法,或者是其中的一部分)

  1. string output = "";
  2. string garbagecan = "";
  3. string tempRead = "";
  4. string lastRead = "";
  5. using (StreamReader reader = nslookup.StandardOutput)
  6. {
  7. while (reader.Peek() != -1)
  8. {
  9. if (LinesRead > 3)
  10. {
  11. tempRead = reader.ReadLine();
  12. tempRead = RemoveIPv6(tempRead);
  13.  
  14. if (tempRead.Contains("Addresses"))
  15. output += tempRead;
  16. else if (lastRead.Contains("Addresses"))
  17. output += tempRead.Trim() + Environment.NewLine;
  18. else
  19. output += tempRead + Environment.NewLine;
  20. lastRead = tempRead;
  21. }
  22. else
  23. garbagecan = reader.ReadLine();
  24. LinesRead++;
  25. }
  26. }
  27. return output;

更正的正则表达式应该只允许删除IPv6地址,并保持IPv4地址不变.将传递到正则表达式的字符串不会单独包含IPv6地址,并且几乎总是包含其他详细信息,因此,地址将在哪个索引出现是不可预测的.在第一次发生IPv6地址之后,正则表达式也会跳过所有其他IPv6地址,因为某些原因,应该注意.

道歉,如果有任何遗漏的细节,我会尽力把他们包括在什么时候提醒.我也喜欢工作代码示例,如果可能,因为我几乎没有关于正则表达式的知识.

解决方法

  1. (?:^|(?<=\s))(([0-9a-fA-F]{1,1}[0-9]))(?=\s|$)

使用回顾,您可以强制执行完全匹配,而不是部分匹配.请参阅演示.

https://regex101.com/r/cT0hV4/5

猜你在找的C#相关文章