【问题标题】:Parsing windows 'ipconfig /all' output解析 windows 'ipconfig /all' 输出
【发布时间】:2013-03-03 09:57:46
【问题描述】:

我在使用正则表达式解析“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# 中轻松获取它们,并且由于某种原因 - 当我要捕获多个“链接本地 IPv6 地址”字段时,它停止工作。

我会很感激任何帮助, 谢谢。

编辑: 另一个问题是我从远程机器接收 ipconfig 数据(那里有一个我无法控制的非托管程序) - 因此我不能使用 WMI 或类似的东西以另一种方式获取 ipconfig 信息。

【问题讨论】:

  • 为什么选择正则表达式?数据已经在 key:value 表示法中。

标签: c# .net regex parsing ipconfig


【解决方案1】:

但我想在 C#.NET 中使用正则表达式。

为什么选择正则表达式?相信我,你不想使用正则表达式。一位智者曾经说过:

有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。

现在让我陈述你的 2 个问题:

  • 使用 ipconfig 检索有关 TCP/IP 配置的信息
  • 使用正则表达式解析此工具的输出

实际上,您可以直接使用 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"];
    }
}

除此之外,您还可以使用Mgmtclassgen.exe 实用程序为这些 WMI 类创建强类型包装器,从而使您的代码更加安全,并且您将能够摆脱魔术字符串。

【讨论】:

  • 感谢您的评论,我已经知道这种方式,但我的问题是我从远程机器接收到 ipconfig 数据(那里有一个我无法控制的非托管程序)
【解决方案2】:

为什么要使用正则表达式?您的输入采用简单的键值格式。使用类似于

的东西
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 () ;
}

【讨论】:

    【解决方案3】:

    您当然可以使用NetworkInterface.GetAllNetworkInterfaces()获取所有这些信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-23
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      相关资源
      最近更新 更多