首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex :如何提取文本中的一些字段

Regex :如何提取文本中的一些字段
EN

Stack Overflow用户
提问于 2014-04-21 07:50:27
回答 2查看 84关注 0票数 0

我有一个文本文件,其中包含以下信息:

代码语言:javascript
复制
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等。现在,我想提取每一行中的信息片段(字段)。我怎么能这么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-21 08:21:52

首先可以提取每个块,然后提取所有信息:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-04-21 09:40:02

我想出了一个不使用regex的解决方案--似乎很有效:

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23193209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档