2013-03-03 37 views
0

我在使用正則表達式解析'ipconfig/all'的輸出時遇到了一些麻煩。 目前我正在使用RegexBuddy進行測試,但我想在C#.NET中使用正則表達式。解析Windows'ipconfig/all'輸出

我的輸出是:

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信息以另一種方式。

+3

爲什麼RegEx?數據已經存在於一個關鍵的價值表示法中。 – 2013-03-03 10:02:19

回答

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() ; 
} 
9

但我想在C#.NET中使用正則表達式。

爲什麼使用正則表達式?相信我,你不想使用正則表達式。聰明人曾經說過:

有些人在遇到問題時想'我知道,我會用正則表達式'。現在他們有兩個問題。

讓我說出你的兩個問題現在:

  • 使用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擺脫魔術字符串。

+0

感謝您的評論,我已經知道這種方式,但我的問題是,我收到來自遠程機器ipconfig數據(有一個非託管程序,我沒有控制) – 2013-03-03 11:36:01