如何用RegEx处理DNS主机名分隔符、提取IP并格式化主机名
解决方案
以下是适配你需求的C#正则实现方案,两个核心功能的代码均可直接复用:
功能1:提取标准点分隔IP地址
实现逻辑:匹配IP段时允许分隔符为.或-,捕获四个八位组后统一替换分隔符为.,同时兼容IP前存在字母前缀的场景。
using System.Text; using System.Text.RegularExpressions; public string ExtractStandardIp(string _hostname) { StringBuilder sb = new StringBuilder(); // 匹配IP,分隔符支持点或横杠,取消不必要的边界限制适配前缀场景 sb.Append(@"(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])[.-]"); sb.Append(@"(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])[.-]"); sb.Append(@"(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])[.-]"); sb.Append(@"(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])"); string ipPattern = sb.ToString(); if (Regex.IsMatch(_hostname, ipPattern, RegexOptions.IgnoreCase)) { Match match = Regex.Match(_hostname, ipPattern, RegexOptions.IgnoreCase); // 所有横杠替换为点得到标准IP格式 return match.Value.Replace('-', '.'); } return string.Empty; }
该实现可完全覆盖你给出的预期IP提取场景。
功能2:格式化主机名为合规存储格式
实现逻辑:分三步处理,既保证前缀部分统一用横杠分隔、字母与数字间补横杠,又保留域名部分的点分隔格式,同时避免非法的连续分隔符:
- 字母与数字相邻处插入横杠
- 前缀部分(IP段与前置字符、后置主机标签之间)的所有点替换为横杠
- 清理多余连续横杠
public string FormatHostnameForStorage(string _hostname) { // 步骤1:字母后紧跟数字的位置插入横杠 string result = Regex.Replace(_hostname, @"(?<=[a-zA-Z])(?=\d)", "-"); // 步骤2:匹配IP段,将IP段内外的点统一替换为横杠 string ipPattern = @"(?: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])[.-](?: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])"; Match ipMatch = Regex.Match(result, ipPattern); if (ipMatch.Success) { // IP段内部的点换成横杠 string normalizedIp = ipMatch.Value.Replace('.', '-'); result = result.Remove(ipMatch.Index, ipMatch.Length).Insert(ipMatch.Index, normalizedIp); // IP前后紧邻的点换成横杠,衔接前后前缀字符 result = Regex.Replace(result, @"(?<=.)\.(?=" + Regex.Escape(normalizedIp) + @")", "-"); result = Regex.Replace(result, @"(?<=" + Regex.Escape(normalizedIp) + @")\.(?=.)", "-"); } // 步骤3:清理连续横杠,避免非法格式 result = Regex.Replace(result, @"-+", "-"); return result; }
该实现输出的主机名完全符合你要求的存储规范,所有测试用例均可匹配预期结果。
内容的提问来源于stack exchange,提问作者DooHickey
相关产品推荐
相关产品推荐

