如何在c#中每四个单词拆分一个字符串?
我正在使用C#4.0,遇到了这样一种情况:我必须将整个字符串每四个单词拆分一次,然后将其存储在列表对象中。 因此,假设我的字符串包含:如何在c#中每四个单词拆分一个字符串?,c#,.net,C#,.net,我正在使用C#4.0,遇到了这样一种情况:我必须将整个字符串每四个单词拆分一次,然后将其存储在列表对象中。 因此,假设我的字符串包含:“USD 1.23 1.12 1.42 EUR 0.2 0.3 0.42 JPY 1.2 1.42 1.53”,结果应该是: USD 1.23 1.12 1.42 EUR 0.2 0.3 0.42 JPY 1.2 1.42 1.53 应将其保存到列表对象中。我试过以下方法 List<string> test = new List<string&
“USD 1.23 1.12 1.42 EUR 0.2 0.3 0.42 JPY 1.2 1.42 1.53”
,结果应该是:
USD 1.23 1.12 1.42
EUR 0.2 0.3 0.42
JPY 1.2 1.42 1.53
应将其保存到列表对象中。我试过以下方法
List<string> test = new List<string>(data.Split(' ')); //(not working as it splits on every word)
List test=新列表(data.Split(“”))//(每一个单词都会分裂,因此不起作用)
最简单的方法是首先将每个单词分成一个列表,然后编写一个小循环,将每组四个单词重新组合。使用一点Linq魔术:
var wordGroups = text.Split(' ')
.Select((word, i) => new { Word = word, Pos = i })
.GroupBy(w => w.Pos / 4)
.Select(g => string.Join(" ", g.Select(x=> x.Word)))
.ToList();
当然,我的答案没有linq的那么吸引人,但我想发布这个
老派的方法
void Main()
{
List<string> result = new List<string>();
string inp = "USD 1.23 1.12 1.42 EUR 0.2 0.3 0.42 JPY 1.2 1.42 1.53";
while(true)
{
int pos = IndexOfN(inp, " ", 4);
if(pos != -1)
{
string part = inp.Substring(0, pos);
inp = inp.Substring(pos + 1);
result.Add(part);
}
else
{
result.Add(inp);
break;
}
}
}
int IndexOfN(string input, string sep, int count)
{
int pos = input.IndexOf(sep);
count--;
while(pos > -1 && count > 0)
{
pos = input.IndexOf(sep, pos+1);
count--;
}
return pos ;
}
被动框架的家伙们为IEnumerable
提供了一系列扩展。其中之一是Buffer
,它可以简单地满足您的需求
这是:
var text = "USD 1.23 1.12 1.42 EUR 0.2 0.3 0.42 JPY 1.2 1.42 1.53";
var result = text.Split(' ').Buffer(4);
这就产生了:
也可以对4个单词进行正则表达式拆分,但我可能会按照您的方式进行拆分。您是否无法控制此字符串的创建?看起来你可以把你的字符串数组循环一下,每4个就生成一个新的字符串?实际上原始字符串是从pdf文件中读取的,我对此没有控制权。这就是为什么我让top find每4个单词循环一次。所以您的字符串可能缺少某个数值?像“1.23美元1.12欧元1.42欧元0.20.3日元1.2欧元1.42欧元1.53”(欧元只有两个值)我认为这将是一个更强大的正则表达式拆分,以防出现不一致的空白使用。我尝试过这一点,但它似乎每5个字而不是每4个字拆分一次。你能检查一下吗?@ConfusedProgrammer:对我来说很好-想想整数除法,分组就变得很明显了:0,1,2,3将在第一组中,4,5,6,7在下一组中,依此类推。嗯……但它还是给了我错误的输出。它分成5个单词。是不是因为这些单词中的数字可能会引起问题?正如@chaospanion所指出的,只有不一致的空格才会引起问题。你给出的例子很好。好的,还有一件事。可以修改正则表达式以接受带逗号的数字吗?e、 g.1625美元。87@ConfusedProgrammer回答已更新,很抱歉延迟,但这里是夜间。感谢更新的正则表达式。我需要对正则表达式做更多的研究,因为它是我的弱点:(…我是否必须导入另一个程序集,因为它无法识别缓冲区函数?您需要获得“Microsoft Interactive Extensions SDK”v1.1.10621。您可以使用NuGet查找“Ix_-Main”。它附带了一系列非常有用的扩展名—“Buffer”、“Case”、“Catch”、“Concat”、“Create”、“Defer”、“DistinctUntilChanged”、“Do”、“DoWhile”、“Expand”、“Finally”、“For”、“ForEach”、“Generate”、“Hide”、“If”、“IgnoreElements”、“IsEmpty”、“Max”、“MaxBy”、“Memoize”、“Min”、“MinBy”、“OnErrorResumeNext”、“Publish”、“Repeat”、“Retry”、“Retry”,“Return”、“Scan”、“SelectMany”、“Share”、“SkipLast”、“StartWith”、“TakeLast”、“Throw”、“Using”、“While”。
string rExp = @"[A-Z]{1,3}(,|\d|\s|\.)*";
var text = "USD 1.23 1.12 1.42 EUR 0.2 0.3 0.42 JPY 1.2 1.42 1.53";
var result = text.Split(' ').Buffer(4);