匹配所有有效格式IPv6地址的正则表达式
本文关键字:IPv6 地址 正则表达式 格式 有效 | 更新日期: 2023-09-27 18:11:01
乍一看,我承认这个问题看起来像是这个问题和任何其他相关问题的重复:
与有效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的答案(中提供的regex模式的问题是,它不匹配,并删除了我向它抛出的完整形式的IPv6地址。
我使用regex模式主要将字符串中的IPv6地址替换为空白或null值。
例如,
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地址总是不同的。对于上面的例子,我从"google.com"answers"yahoo.com"获得了这些IPv6地址。
我没有使用内置功能来解析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地址不变将传递给regex的字符串不会仅包含IPv6地址,而且几乎总是包含其他详细信息,因此,地址将出现在哪个索引是不可预测的应该注意的是,由于某种原因,regex也会跳过第一个出现的IPv6地址之后的所有其他IPv6地址。
很抱歉,如果有任何遗漏的细节,我会尽力在收到通知时将其包括在内。如果可能的话,我也更喜欢工作代码示例,因为我对正则表达式几乎一无所知。
(?:^|(?<='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
(?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存储库