C# - 正则表达式匹配模式、替换和捕获行号 [来自 Txt 文件]
Posted
技术标签:
【中文标题】C# - 正则表达式匹配模式、替换和捕获行号 [来自 Txt 文件]【英文标题】:C# - Regex match pattern, replace and capture line number [From Txt File] 【发布时间】:2017-09-27 10:22:56 【问题描述】:我对 C# 比较陌生。
我正在读取文本文件的内容,应用正则表达式模式来查找和替换匹配的 IP 地址。此外,捕获替换文本的行号。
文本文件内容:ips.txt
计算机A的地址192.168.1.1
随机 IP 地址 199.255.255.1 192.168.3.1
121.225.56.6
计算机A - 192.168.1.1
想要的输出:
第 1 行:192.168.1.1 ---> IP-Address-1
第 3 行:199.255.255.1 ---> IP-Address-2
第 3 行:192.168.3.1 ---> IP-Address-3
第 5 行:121.225.56.6 ---> IP-Address-4
第 7 行:192.168.1.1 ---> IP-Address-1
守则:
static void Main(string[] args)
string ipname = "IP-ADDRESS";
string pattern = (@"\b\d1,3\.\d1,3\.\d1,3\.\d1,3\b");
string _ipdata = string.Empty;
using (StreamReader sr = new StreamReader(@"ips.txt"))
_ipdata = sr.ReadToEnd();
MatchCollection collection = Regex.Matches(_ipdata, pattern);
int i = 0;
while (i < collection.Count)
foreach (Match m in collection)
_ipdata = _ipdata.Replace(m.Value, ipname+(i+1));
i++;
Console.WriteLine(_ipdata);
Console.ReadKey();
我设法得到以下输出:
计算机的地址A IP-ADDRESS1
随机 IP 地址 IP-ADDRESS2 IP-ADDRESS3
IP-ADDRESS4
计算机 A - IP-ADDRESS1
更新:
通过以下答案,能够获得所需的输出。
但是,正在寻找两个输出。上面的一个和所需的输出也是如此。
提前致谢。
【问题讨论】:
【参考方案1】:您无需将整个文件读入字符串以便稍后处理。一种更有效的方法是逐行读取输入字符串并在阅读时处理每一行。这也将使维护行号计数器更容易。
1234563.Cast<Match>()
将匹配集合转换为 IEnumerable<Match>
,从而简化了匹配的迭代。
特定的 IP 地址是匹配的字符串,因此检索为 match.Value
。
当您检索到一个 IP 地址时,您需要在已找到的地址中查找它(为其提供正确的“IP-ADDRESS-X”名称)。那些已经找到的地址最好用字典来管理(见代码中的foundAddresses
)。
string ipname = "IP-ADDRESS-";
var ipAddrRegex = new Regex(@"\b\d1,3\.\d1,3\.\d1,3\.\d1,3\b", RegexOptions.Compiled);
int lineNum = 1;
int addressNum = 1;
var foundAddresses = new Dictionary<string, string>();
string line;
using (StreamReader sr = new StreamReader(@"ips.txt"))
while ((line = sr.ReadLine()) != null)
foreach (var match in ipAddrRegex.Matches(line).Cast<Match>())
string addressName;
if (!foundAddresses.TryGetValue(match.Value, out addressName))
addressName = ipname + addressNum.ToString();
foundAddresses.Add(match.Value, addressName);
addressNum++;
Console.WriteLine("Line 0: 1 ---> 2", lineNum, match.Value, addressName);
lineNum++;
演示:https://dotnetfiddle.net/oqmav4
【讨论】:
非常感谢您的详细解释。我正在尝试在 StreamWriter 的帮助下将此结果输出到文本文件中。我们如何生成与 ips.txt 格式相同但替换 ip 值的修改文件。 请检查更新!尝试用原始 ips.txt 文件中的字符串替换 ip 并显示所需的输出。 @Tango,我不太明白你想在输出文件中看到什么。它是控制台输出的副本还是应该是每个 IP 地址替换为IP-ADDRESS-X
的输入文件?
是的,替换为 IP-ADDRESS-X (ips.txt) 并根据您在不同文件中的答案生成输出以上是关于C# - 正则表达式匹配模式、替换和捕获行号 [来自 Txt 文件]的主要内容,如果未能解决你的问题,请参考以下文章