正在分析多行中的一组行

本文关键字:一组 | 更新日期: 2023-09-27 18:22:14

我试图解析字符串[]中的一组行,如下所示:

  • 垃圾
  • 职务……先生<--开始相关数据
  • 化名约翰史密斯
  • 化名约翰·史密斯
  • 问候语<--结束相关数据
  • 垃圾
  • 垃圾
  • 头衔夫人<--开始相关数据
  • 别名janesmith
  • 化名简。史密斯
  • 问候语<--结束相关数据
  • 垃圾

我需要提取每组记录的信息。。。类似以下内容:

用户标题用户别名用户别名用户问候语

我一直在想如何最好地处理这个问题,比如使用Regex或分层循环,但似乎无法理解。以前有人处理过这个问题吗?可以提供一些建议吗?

正在分析多行中的一组行

您可以只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; }
}

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;}
}

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

(Title(.*'r'n)+?Salutation)

或使用捕获组:

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

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