C# - 正则表达式匹配模式,替换和捕获行号[来自Txt文件]

时间:2017-04-29 10:57:35

标签: c# .net regex winforms

我对C#比较陌生。

我正在阅读文本文件的内容,应用Regex Pattern查找并替换匹配的IP地址。另外,捕获文本被替换的行号。

文本文件的内容:ips.txt

  

计算机地址192.168.1.1

     

随机IP地址199.255.255.1 192.168.3.1

     

121.225.56.6

     

ComputerA - 192.168.1.1

所需的输出:

  

第1行:192.168.1.1 ---> IP-地址-1

     

第3行:199.255.255.1 ---> IP-地址-2

     

第3行:192.168.3.1 ---> IP-地址-3

     

第5行:121.225.56.6 ---> IP-地址-4

     

第7行:192.168.1.1 ---> IP-地址-1

守则:

  static void Main(string[] args)
    {

        string ipname = "IP-ADDRESS";
        string pattern = (@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,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-地址4

     

ComputerA - IP-ADDRESS1

更新

通过以下答案,能够获得所需的输出。

然而,寻找两个输出。上面的那个和所需的输出。

提前致谢。

1 个答案:

答案 0 :(得分:1)

  1. 您无需将整个文件读入字符串以便稍后处理。一种更有效的方法是逐行读取输入字符串,并在读取时处理每一行。这也可以更容易维护行号计数器。

  2. 当您阅读一行时,您可以使用以下构造轻松地从中提取所有IP地址:ipAddrRegex,其中Regex和预先创建的.Cast<Match>()实例(请参阅下面的代码)。 IEnumerable<Match>将匹配集转换为match.Value,这简化了匹配的迭代。

  3. 特定的IP地址是匹配的字符串,因此将其检索为foundAddresses

  4. 当您检索到IP地址时,您需要在已找到的地址中查找它(以便为其提供正确的“IP-ADDRESS-X”名称)。那些已经找到的地址最好用字典管理(参见代码中的string ipname = "IP-ADDRESS-"; var ipAddrRegex = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,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++; } } )。

  5. {{1}}

    演示:https://dotnetfiddle.net/oqmav4