2014-04-21 55 views
0

我有一個包含以下信息的文本文件:正則表達式:如何提取一些字段文本

add comment=user1 disabled=yes name=userA password=123456 profile=\ 
    Internet-128K service=pppoe 
add name=user2 password=123 profile=Internet-2M service=pppoe 
add disabled=yes name=user3 password=316 profile=Internet-2M service=\ 
    pppoe 
add disabled=yes name=user4 password=1216 profile=Internet-512K service=\ 
    pppoe 
add caller-id=8C:89:A5:68:18:9A name=user5 password=308 profile=\ 
    Internet-256K remote-ipv6-prefix=::/64 service=pppoe 
... 

,你可以看到每行開頭add包含的一些信息(域)爲例comment, disabled, name, password, profile和等等。現在我想在每一行中提取這些信息(字段)。我怎樣才能做到這一點?

+0

那麼在你的想法解決問題。 – devnull

+0

你想怎麼做? 所有評論只有一行?以什麼方式提取? – PradyJord

+0

所以,這是我的問題。正如我所提到的每一行都是以添加其他數據爲其領域。 –

回答

1

首先,你可以提取每一個塊,第二你提取所有信息:

string text = File.ReadAllText("sample.txt"); 
string[] items = Regex.Matches(text, "add .*?(?=\r\nadd|$)", RegexOptions.Singleline) 
         .Cast<Match>() 
         .Select(m => m.Value) 
         .ToArray(); 
foreach (string item in items) 
{ 
    string line = Regex.Replace(item, @"\\\s*\r\n\s*", string.Empty); 
    KeyValuePair<string, string>[] pairs = Regex.Matches(line, @"(?<name>\w+)=(?<value>.*?)(?=\w+=|$)") 
               .Cast<Match>() 
               .Select(m => new KeyValuePair<string, string>(m.Groups["name"].Value, m.Groups["value"].Value)) 
               .ToArray(); 

    Console.WriteLine(line); 
    foreach (var pair in pairs) 
     Console.WriteLine("{0} = {1}", pair.Key, pair.Value); 
} 
1

我想出了一個解決方案不使用正則表達式的 - 似乎工作:

List<Dictionary<string, string>> listDict = new List<Dictionary<string, string>>(); 
string[] text = File.ReadAllLines("sample.txt"); 
text.ToList().ForEach(line => 
{ 
    IEnumerable<string> kvpList = line.Split(' ').Skip(1); 
    Dictionary<string, string> lineDict = new Dictionary<string, string>(); 
    kvpList.ToList().ForEach(kvpItem => 
    { 
     string[] kvp = kvpItem.Split('='); 
     lineDict.Add(kvp[0], kvp[1]); 
    }); 
    listDict.Add(lineDict); 
}); 

//Output for debug purposes 
listDict.ForEach(resultLine => 
{ 
    resultLine.ToList().ForEach(resultPair => Console.Write(String.Format("{0}:{1} ", resultPair.Key, resultPair.Value))); 
    Console.WriteLine(); 
}); 
Console.ReadLine();