2017-01-26 25 views
0

我有看起来像这样的字符串。每行都是\r分隔,为了视觉目的放置在这里。使用已知密钥按分组划分文本

BEGIN_SECTIONS_INFORMATION 
NUMSECTIONS=6 
SECTION_GROUPNAME[1]=GROUP_1 
SECTION_NAME[1]=foo 
BEGIN_SECTION[1] 
//blah... 
END_SECTION[1] 
SECTION_GROUPNAME[2]=GROUP_2 
SECTION_NAME[2]=bazzz 
BEGIN_SECTION[2] 
//blah... 
END_SECTION[2] 
END_SECTIONS_INFORMATION 

我需要SECTION_GROUPNAME拆分此字符串转换成IEnumerable<T>这样的:

指数0:

SECTION_GROUPNAME[1]=GROUP_1 
SECTION_NAME[1]=foo 
BEGIN_SECTION[1] 
//blah... 
END_SECTION[1] 

指数1:

SECTION_GROUPNAME[2]=GROUP_2 
SECTION_NAME[2]=bazzz 
BEGIN_SECTION[2] 
//blah... 
END_SECTION[2] 

规则:

  • 每节以SECTION_GROUPNAME[n]开头。
  • 每节有一个SECTION_NAME[n]并有一个BEGIN_END_
  • 部分名称是唯一的。

我曾尝试:

var sections = from line in sectionGroups 
       where line.StartsWith("SECTION_GROUPNAME") 
       group line by "SECTION_GROUPNAME"; 

也试过

var sections = sectionGroups.Split(new string[] { "SECTION_GROUPNAME" }, StringSplitOptions.None); 

this post,OP创建团体枚举/列表。我不能这样做,因为我不知道字符串中会有多少组/部分。

+0

你只想找一个'IEnumerable的'和假设myEnumerable [N]匹配SECTION_GROUPNAME [N],或者你希望也从中提取的关键文本?如果是后者,你在寻找什么关键。如果前者,为什么你的分手不适合你?你不能只是将SECTION_GROUPNAME追加到每个结果字符串的开头吗? – Kolichikov

+0

我的分割结果在SECTION_GROUPNAME之前的所有内容(第一个,后面的所有分割都没有分割)以及之后的所有内容。 – Kyle

回答

2

假设您想要一个包含您描述的所有内容而没有关键结构的字符串的IEnumerable<T>

基本的想法是删除你不想要的东西(开始和结束位),然后通过所需字符串的开始进行拆分。最后,分割文本不会将其放入结果数组中,因此您必须手动将其添加回来。

以下为我工作:

static string s = @"BEGIN_SECTIONS_INFORMATIONNUMSECTIONS=6SECTION_GROUPNAME[1]=GROUP_1SECTION_NAME[1] = foo\rBEGIN_SECTION[1]\rEND_SECTION[1]\rSECTION_GROUPNAME[2]=GROUP_2SECTION_NAME[2] = bazzzBEGIN_SECTION[2]END_SECTION[2]END_SECTIONS_INFORMATION"; 


static void Main(string[] args) 
{ 
    var withoutEnd = s.Split(new[] {"END_SECTIONS_INFORMATION"}, StringSplitOptions.RemoveEmptyEntries); 
    var SplitItems = withoutEnd[0].Split(new[] { "SECTION_GROUPNAME"}, StringSplitOptions.None).ToList(); 
    SplitItems.RemoveAt(0); //the first part is just the introduction 
    var result = SplitItems.Select(x => "SECTION_GROUPNAME" + x); 

}