2014-01-21 78 views
3

因此,我正在C#中的一個小項目工作,並希望讀取長文本文件,當它遇到該行"X-Originating-IP: [192.168.1.1]"我想抓住IP並顯示到控制檯只是公認的IP#,所以只是192.168.1.1等。我無法理解正則表達式。任何能夠讓我開始的人都會很感激。我到目前爲止已經在下面。需要幫助從c#中的字符串獲取IP

namespace x.Originating.Ip 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int counter = 0; 
      string line; 
      System.IO.StreamReader file = 
       new System.IO.StreamReader("C:\\example.txt"); 

      while ((line = file.ReadLine()) != null) 
      { 
       if (line.Contains("X-Originating-IP: ")) 
       Console.WriteLine(line); 
       counter++; 
      } 

      file.Close(); 
      Console.ReadLine(); 
     } 
    } 
} 
+3

在幾年前,這將一直是個簡單的'(\ d + \ \ d + \ \ d +。 \。\ d +)'類型的情況,但是現在你也必須處理IPv6地址,這是完全不同的球類遊戲。 –

回答

4

你並不需要經常使用表情:

if (line.Contains("X-Originating-IP: ")) { 
    string ip = line.Split(':')[1].Trim(new char[] {'[', ']', ' '}); 
    Console.WriteLine(ip); 
} 
+1

+1不使用正則表達式:) – rhughes

+0

這將給出像[192.168.1.1] – DareDevil

+1

@DareDevil的輸出,我更新了代碼以修剪'[',']'。謝謝你指出。 – falsetru

0

我不知道,但我想你的文本文件包含一個IP地址的每一行,現在您的代碼可以簡化像這樣如下:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Text.RegularExpressions; 


namespace x.Originating.Ip 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string[] lines = System.IO.File.ReadAllLines("Your path & filename.extension"); 
      Regex reg = new Regex("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"); 
      for (int i = 0; i < lines.Length; ++i) 
      { 
       if (reg.Match(lines[i]).Success) 
       { 
        //Do what you want........ 
       } 
      } 
     } 
    } 
} 
0

下面的正則表達式應該得到你想要的東西:

(?<=X-Originating-IP: +)((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 

這使用積極lookbehind來斷言"X-Originating-IP: "存在後跟IPv4地址。只有IP地址將被比賽捕獲。

4

試試這個例子:

//Add this namespace 
using System.Text.RegularExpressions; 

String input = @"X-Originating-IP: [192.168.1.1]"; 
Regex IPAd = new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"); 
MatchCollection MatchResult = IPAd.Matches(input); 
Console.WriteLine(MatchResult[0]); 
0

而不是做一個正則表達式,它看起來像你解析MIME電子郵件,考慮LumiSoft.Net.MIME它可以讓你訪問的頭一個定義的API。

另外,使用內置的IPAddress.Parse類,它同時支持IPv4和IPv6:

const string x_orig_ip = "X-Originating-IP:"; 
string header = "X-Originating-IP: [10.24.36.17]";  

header = header.Trim(); 
if (header.StartsWith(x_orig_ip, StringComparison.OrdinalIgnoreCase)) 
{ 
    string sIpAddress = header.Substring(x_orig_ip.Length, header.Length - x_orig_ip.Length) 
     .Trim(new char[] { ' ', '\t', '[', ']' }); 
    var ipAddress = System.Net.IPAddress.Parse(sIpAddress); 
    // do something with IP address. 
    return ipAddress.ToString(); 
}