1

我正在尝试解析 string[] 中的一组行,如下所示:

  • 垃圾……
  • Title Mr ..... <--开始相关数据
  • 别名约翰史密斯...
  • 别名约翰·史密斯...
  • 称呼... <--结束相关数据
  • 垃圾...
  • 垃圾……
  • Title Mrs..... <--开始相关数据
  • 别名简史密斯...
  • 别名简.史密斯...
  • 称呼... <--结束相关数据
  • 垃圾...

我需要为每组记录提取信息......如下所示:

User.Title User.alias User.alias User.Salutation

我一直在试图弄清楚如何最好地处理这个问题,比如使用正则表达式或分层循环,但似乎无法理解这一点。有没有人处理过这个问题并可以提供一些建议?

4

3 回答 3

3

您可以只foreach显示线条并在出现时开始记录数据,Title直到Salutation出现。

就像是:

var lines = File.ReadLines("c:\\StackOverflow.txt");

List<User> results = new List<User>();
bool titleFound = false;
User current = null;
foreach (var line in lines)
{
    if (line.StartsWith("Title"))
    {
        titleFound = true;
        current = new User { Alias = new List<string>() };
        current.Title = line;
    }

    if (titleFound)
    {
        if (line.StartsWith("alias"))
        {
            current.Alias.Add(line);
        }
        if (line.StartsWith("Salutation"))
        {
            current.Salutation = line;
            results.Add(current);
            titleFound = false;
        }
    }
}


public class User
{
    public string Title { get; set; }
    public List<string> Alias  { get; set; }
    public string Salutation  { get; set; }
}
于 2013-07-15T04:23:50.560 回答
1

linqpad 中一个非常粗略的 Loop 实现:

void Main()
{
    var input = new [] {
                            "junk ....",
                            "Title Mr .....",
                            "alias johnsmith...",
                            "alias john.smith...",
                            "Salutation ...",
                            "junk ...",
                            "junk ....",
                            "Title Mrs .....",
                            "alias janesmith...",
                            "alias jane.smith...",
                            "Salutation ...",
                            "junk ..."
                        };

    for (int i = 0; i < input.Count(); i++)
    {
        if(input[i].StartsWith("Title"))
        {
            var tempUser = new user();
            tempUser.Title = input[i];
            i++;
            while(input[i].StartsWith("alias"))
            {
                tempUser.Aliases.Add(input[i]);
                i++;
            }

            if(input[i].StartsWith("Salutation"))
            {
                tempUser.Salutation = input[i];
            }
            tempUser.Dump();
        }
    }
}

public class user
{
    public user()
    {
        Aliases = new List<string>();
    }
    public string Title { get; set;}
    public string Salutation { get; set;}
    public List<string> Aliases { get; set;}
}

它没有很多错误处理,并对您的数据做出一些假设,但这将是一个很好的起点。

于 2013-07-15T04:15:56.947 回答
1
(Title(.*\r\n)+?Salutation)

或使用捕获组:

(Title (?<Title>.*\r\n)alias (?<Alias>.*\r\n)+?Salutation (?<Salutation>.*))

regex你需要的。在你得到这个之后,我会解析得到你想要的对象数据。但这将为您提供所需的所有数据。

于 2013-07-15T04:07:34.680 回答