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&lt;Match&gt;() 将匹配集合转换为 IEnumerable&lt;Match&gt;,从而简化了匹配的迭代。

    特定的 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 文件]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

grepsedawk

了解下C# 正则表达式

正则表达式(re)

正则表达式在 C# 中按组替换

C# 正则表达式