2012-08-09 81 views
1

我有一个字符串,其中的字数可能会有所不同。像:使用正则表达式和C分割字符串并添加到列表#

string a_string = " one two three four five six seven etc etc etc "; 

我如何分割字符串到每个5个字,而且每个都将其添加到列表,使得它成为字符串列表(含5个字每个字符串)。我认为列表会更好,因为字符串中的单词数量可能会有所不同,因此列表可以相应地增加或减少。

我尝试使用正则表达式通过下面的代码行获得第5个字:

Regex.Match(rawMessage, @"(\w+\s+){5}").ToString().Trim();

,但一下就如何进一步进行,并添加动态和强劲列出不确定。我猜正则表达式可以进一步帮助,或者一些很棒的字符串/列表功能?你能指导我一下吗?最后,我想列表[0]包含“一个两个三个四个五”和列表[1]包含“六个七等等等等等等”,等等..谢谢。

回答

1

拆分的话不需要正则表达式,字符串提供了此功能:

var list = str.Split(' ').ToList(); 

ToList()是一个LINQ extensi on方法将IEnumerable<T>对象转换为列表(Split()方法返回字符串数组)。

要组由5个单词的列表,使用此代码片段:

var res = list 
    .Select((s, i) => new { Str = s, Index = i }) 
    .GroupBy(p => p.Index/5) 
    .Select(g => string.Join(" ", g.Select(v => v.Str))); 
+1

这不是他的要求其实..他在最后要求聚集.. – Tigran 2012-08-09 08:07:20

+0

@Tigran聚集最后是第二个子问题,而且他不清楚他想如何重新聚合。很明显,如果将分割结果转换为列表,则OP难以将结果转换。 – dasblinkenlight 2012-08-09 08:11:52

+0

@Tigran有关如何在没有循环的情况下重新分组的示例,请查看我的更新。 – dasblinkenlight 2012-08-09 08:20:40

0

您可以使用简单的

a_string.Split(' '); 

然后循环throught结果数组,并填写您的列表,只要你想,例如

int numOfWords = 0; 
int currentPosition = 0; 
foreach (var str in a_string.Split(' ')) 
{ 
    if (numOfWords == 5) 
    { 
    numOfWords = 0; 
    currentPosition++; 
    } 
    list[currentPosition] += str; 
    numOfWords++; 
} 
3
var listOfWords = Regex.Matches(a_string, @"(\w+\s+){1,5}") 
    .Cast<Match>() 
    .Select(i => i.Value.Trim()) 
    .ToList(); 
+0

它适用于listOfWords [0],但我无法通过listOfWords [1]等访问剩余的单词。如果该字符串包含100个单词,我希望每个单词有20个字符串从listOfWords [0]到listOfWords [19]。另外,如果有97个单词,那么它将是相同的,只不过listOfWords [19]只有2个单词。任何帮助?谢谢。 – 2012-08-09 08:21:12

+0

它能正常工作以获得'listOfWords [1]',我将更改代码以覆盖97个单词。 – Charlie 2012-08-09 08:31:50

+0

for listOfWords [1],我得到“索引超出范围,必须是非负数,小于集合的大小。” 参数名称:索引“。 : -/ – 2012-08-09 08:42:42