Синтаксический анализ окон ipconfig /all

У меня возникли проблемы с анализом вывода "ipconfig /all" с использованием регулярных выражений. В настоящее время я использую RegexBuddy для тестирования, но я хочу использовать регулярные выражения в C#.NET.

Мой вывод:

Ethernet adapter Yes:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : MAC Bridge Miniport
   Physical Address. . . . . . . . . : 02-1F-29-00-85-C9
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   Link-local IPv6 Address . . . . . : fe80::f980:c9c3:a574:37a%24(Preferred)
   Link-local IPv6 Address . . . . . : fe80::f980:c9c3:a574:37a7%24(Preferred)
   Link-local IPv6 Address . . . . . : fe80::f980:c9c3:a574:37a8%24(Preferred)
   IPv4 Address. . . . . . . . . . . : 10.0.0.1(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.0.0
   IPv4 Address. . . . . . . . . . . : 172.16.0.1(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 172.16.0.254
   DHCPv6 IAID . . . . . . . . . . . : 520228888
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-17-1C-CC-CF-00-1F-29-00-85-C9
   DNS Servers . . . . . . . . . . . : 192.162.100.15
                                       192.162.100.16
   NetBIOS over Tcpip. . . . . . . . : Enabled

Регулярное выражение, которое я написал до сих пор:

([ -~]+):.+(?:Description\s)(?:\.|\s)+:\s([ -~]+).+(?:Physical Address)(?:\.|\s)+:\s([ -~]+).+(?:DHCP Enabled)(?:\.|\s)+:\s([ -~]+).+(?:(?:Link-local IPv6 Address)(?:\.|\s)+:\s([ -~]+).+Preferred.+)+

Проблема в том, что я хочу собрать все полезные поля как группы, чтобы их было легко получить в C#, и по какой-то причине - когда мне удалось захватить несколько полей 'Link-local IPv6 Address', он перестал работать.

Я буду признателен за любую помощь, спасибо.

Изменить: Другая проблема заключается в том, что я получаю данные ipconfig с удаленной машины (там есть неуправляемая программа, которой я не могу управлять) - таким образом, я не могу использовать WMI или что-то подобное для получения информации ipconfig в другой путь.

3 ответа

Решение

Зачем использовать регулярные выражения? Ваш ввод в простом формате ключ-значение. Используйте что-то вроде

foreach (var line in lines)
{
   var index  = line.IndexOf (':') ;
   if (index <= 0) continue ; // skip empty lines

   var key   = line.Substring (0,  index).TrimEnd (' ', '.') ;
   var value = line.Substring (index + 1).Replace ("(Preferred)", "").Trim () ;
}

но я хочу использовать регулярное выражение в C#.NET.

Почему Regex? Поверьте мне, вы не хотите использовать регулярные выражения. Один мудрец однажды сказал:

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

Позвольте мне изложить ваши две проблемы прямо сейчас:

  • Получить информацию о конфигурации TCP/IP с помощью ipconfig
  • Разобрать выходные данные этого инструмента с помощью регулярных выражений

На самом деле вы можете получить эту информацию напрямую с помощью WMI и, таким образом, решить исходную проблему и больше никогда не думать об использовании регулярных выражений:

using (var mc = new ManagementClass("Win32_NetworkAdapterConfiguration"))
using (var instances = mc.GetInstances())
{
    foreach (ManagementObject instance in instances)
    {
        if (!(bool)instance["ipEnabled"])
        {
            continue;
        }

        Console.WriteLine("{0}, {1}, {2}", instance["Caption"], instance["ServiceName"], instance["MACAddress"]);

        string[] ipAddresses = (string[])instance["IPAddress"];
        string[] subnets = (string[])instance["IPSubnet"];
        string[] gateways = (string[])instance["DefaultIPGateway"];
        string domains = (string)instance["DNSDomain"];
        string description = (string)instance["Description"];
        bool dhcp = (bool)instance["DHCPEnabled"];
        string[] dnses = (string[])instance["DNSServerSearchOrder"];
    }
}

В дополнение к этому вы можете создать строго типизированную оболочку для этих классов WMI, используя Mgmtclassgen.exe Утилита делает ваш код еще безопаснее, и вы сможете избавиться от волшебных строк.

Конечно, вы можете получить всю эту информацию с помощью NetworkInterface.GetAllNetworkInterfaces()

Другие вопросы по тегам