Извлечь Specifi c текст из текстового файла, используя C# - PullRequest
0 голосов
/ 10 февраля 2020

Я хочу извлечь только IP-адреса из текстового файла с помощью Regex.

Interface: 192.168.8.100 --- 0x11
Internet Address    Physical Address    Type
  192.168.8.1         a8-7d-12-c6-73-2c   dynamic
  192.168.8.255       ff-ff-ff-ff-ff-ff   static
  224.0.0.22          01-00-5e-00-00-16   static
  224.0.0.251         01-00-5e-00-00-fb   static
  224.0.0.252         01-00-5e-00-00-fc   static
  239.255.102.18      01-00-5e-7f-66-12   static
  239.255.255.250     01-00-5e-7f-ff-f1   static
  255.255.255.255     ff-ff-ff-ff-ff-ff   static

Например, на этом рисунке я хочу только IP-адреса, которые соответствуют этой строке, 192.168. и так далее. и хотел бы сохранить каждое совпадение в отдельной переменной.

            string path = @"C:\Test\Result.txt";
            StringBuilder buffer = new StringBuilder();

            using (var sr = new StreamReader(path))
            {
                while (sr.Peek() >= 0)
                {
                    if (Regex.IsMatch(sr.ReadLine(), "192"))
                        buffer.Append(sr.ReadLine());

                }
            }
            Console.WriteLine(buffer.ToString());

Я пробовал этот код, но результаты не очень убедительны.

CMD Results

Также, как мы видим, этот фрагмент кода не обеспечивает все совпадения.

Я также пробовал этот код

            // Spilt a string on alphabetic character  
            string azpattern = "[a-z]+";
            string str ="192.168.1.1 tst sysy 192.168.3.1";



            string[] result = Regex.Split(str, azpattern, RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(500));
            for (int i = 0; i < result.Length; i++)
            {
                Console.Write("{0}", result[i]);
                if (i < result.Length - 1)
                    Console.Write("\n");
            }

Но вход вызывает у меня проблему , Я не знаю, как использовать текстовый файл в качестве ввода. Кроме того, результат снова не очень убедителен.

В любом случае, кто-нибудь может мне помочь получить результат в этой форме?

String IP1 = 192.168.0.1;
String IP2 = 192.168.0.2;

и так далее, пока не останется 192 .. .. в файле также было бы здорово, если бы мы пропустили первые 3 строки при чтении, поскольку они бесполезны в моем сценарии.

1 Ответ

2 голосов
/ 10 февраля 2020

Я думаю, этого должно быть достаточно:

const string ipPattern = @"^\s*(192\.168\.\d{1,3}\.\d{1,3})";
var ipRegex = new Regex(ipPattern);

var ipAddresses192168 = File.ReadAllLines(@"C:\Test\Result.txt")
    .Skip(3) // Skip 3 lines
    .Where(line => ipRegex.IsMatch(line))
    .Select(line => ipRegex.Match(line).Groups[1].Value);

foreach (var ipAddress in ipAddresses192168)
{
    Console.WriteLine(ipAddress);
}

Он извлекает только ip-адреса, которые начинаются с 192.168 и пропускает 3 первые строки.

...