正在分析多行中的一组行
本文关键字:一组 | 更新日期: 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
。在你得到这个之后,我会解析得到你想要的对象数据。但这将为您提供所需的所有数据。