1

正規表現を使用して「ipconfig/all」の出力を解析するのに少し問題があります。現在、テストに正規表現を使用していますが、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情報を取得することはできません仕方。

4

3 に答える 3

10

しかし、C#.NETで正規表現を使用したいと思います。

なぜ正規表現?私を信じてください、あなたは正規表現を使いたくないのです。賢い人はかつて言った:

問題に直面したときに、「わかっている、正規表現を使用する」と考える人もいます。今、彼らは2つの問題を抱えています。

今あなたの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クラスの厳密に型指定されたラッパーを作成すると、コードがさらに安全になり、tpoでマジックストリングを取り除くことができます。

于 2013-03-03T10:08:01.167 に答える
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 () ;
}
于 2013-03-03T11:56:46.640 に答える
0

確かに、このすべての情報を使用して取得できますNetworkInterface.GetAllNetworkInterfaces()

于 2013-03-03T10:47:23.800 に答える