C#Regex.Split:删除空结果我正在开发一个导入数千行的应用程序,其中每行具有以下格式:|*9070183020|04.02.2011|107222|M/SSUNNYMEDICOS|加兹巴德|32,768.00|我使用以下常规Regex将行拆分为我需要的数据:RegexlineSplitter=newRegex(@"(?:^|*||)s*(.*?)s+(?=|)");字符串[]列=lineSplitter.Split(数据);foreach(列中的字符串c)Console.Write("["+c+"]");这给了我以下结果:[][9070183020][][04.02.2011][][107222][][M/SSUNNYMEDICOS][][GHAZIABAD][][32,768.00][|]现在我有两个问题。1.如何去除空结果。我知道我可以使用:string[]columns=lineSplitter.Split(data).Where(s=>!string.IsNullOrEmpty(s)).ToArray();但是有没有内置的方法来删除空结果?2、最后一根管子怎么拆?感谢您的帮助。问候,乔杰什。编辑:我想我有点误解了我的问题。从来没有关于我如何做到这一点。这只是关于如何通过更改上面代码中的常规Regex来实现的。我知道我可以通过多种方式做到这一点。我已经使用上面提到的代码和Where子句以及另一种更快的方式(也超过两倍)完成了它:Regexregex=newRegex(@"(^|*s*)|(s*|s*)");data=regex.Replace(data,"|");string[]columns=data.Split(new[]{'|'},StringSplitOptions.RemoveEmptyEntries);第二,作为测试用例,我的系统在原来的方法中不到1.5秒就可以解析92k+这样的行,而在第二种方法中不到700毫秒,在实际情况下我从来没有发现超过几千行,所以我我想我不需要在这里考虑速度。在我看来,在这种情况下考虑速度是过早的优化。我找到了第一个问题的答案:我不能使用Split,因为没有内置选项。仍在寻找我的第二个问题的答案。RegexlineSplitter=newRegex(@"[s**]*|[s**]*");varcolumns=lineSplitter.Split(data).Where(s=>s!=String.Empty);或者你可以简单地做:string[]columns=data.Split(newchar[]{'|'},StringSplitOptions.RemoveEmptyEntries);foreach(列中的字符串c)this.textBox1.Text+="["+c.Trim('','*')+"]"+"rn";不,没有选项可以删除RegEx.Split的空条目,就像String.Split一样。您也可以使用火柴。我认为这可能等同于删除空字符串:string[]splitter=Regex.Split(textvalue,@"s").Where(s=>s!=String.Empty).ToArray();作为splitting的替代方法,当分隔符也出现在输入的开头和结尾时,它总是会引起麻烦,您可以尝试匹配管道中的内容:foreach(vartokeninRegex.Matches(input,@"|*?s*(S[^|]*?)s*(?=|)")){Console.WriteLine("[{0}]",token.Groups[1].Value);}//打印以下内容://[9070183020]//[04.02.2011]//[107222]//[M/SSUNNYMEDICOS]//[GHAZIABAD]//[32,768.00]在你的情况下不要使用正则表达式。它似乎不需要,并且正则表达式比直接使用字符串函数慢得多(并且开销更高)。所以使用类似的东西:constChar[]splitChars=newChar[]{'|'};string[]splitData=data.Split(splitChars,StringSplitOptions.RemoveEmptyEntries)我这里可能有错误的想法,但你只想使用'|'分割数据字符串字符作为分隔符?在这种情况下,您可以:string[]result=data.Split(new[]{"|"},StringSplitOptions.RemoveEmptyEntries).Select(d=>d.Trim()).ToArray();这将返回所有不带空格的字段并删除空字段。您可以在“选择”部分中根据需要格式化结果,例如.Select(d=>"["+d.Trim()+"]").ToArray();基于@JaroslavJandek的出色回答,我写了一个扩展方法,我把它放在这里,也许它可以节省你的时间。//////String.SplitwithRemoveEmptyEntries选项用于清除结果中的空条目//////要解析的值///分隔符///提示:传递-1以获取最后一项///获取数组分割值的///publicstaticobjectCleanSplit(thisstrings,charseparator,intindex,boolwholeResult=false){if(string.IsNullOrWhiteSpace(s))return"";varsplit=s.Split(newchar[]{separator},StringSplitOptions.RemoveEmptyEntries);如果(wholeResult)返回拆分;如果(index==-1)返回split.Last();if(split[index]!=null)returnsplit[index];返回””;}1.如何删除空结果?您可以使用LINQ删除所有等于string.Empty的条目:string[]columns=lineSplitter.Split(data);columns=columns.ToList().RemoveAll(c=>c.Equals(string.Empty)).ToArray();2、最后一根管子怎么拆?您可以在此处使用LINQ删除等于要删除的字符的所有条目:columns=columns.ToList().RemoveAll(c=>c.Equals("|")).ToArray();这个怎么样:假设我们有一行:line1="|*9070183020|04.02.2011|107222|M/SSUNNYMEDICOS|GHAZIABAD|32,768.00|";我们可以得到想要的结果:string[]columns=Regex.Split(line1,"|");foreach(列中的字符串c)c=c.Replace("*","").Trim();这样会得到如下结果:[9070183020][04.02.2011][107222][M/SSUNNYMEDICOS][GHAZIABAD][32,768.00]使用此解决方案:以上为C#学习教程:C#Regex.Split:Removeempty成果分享如果对你有用,需要了解更多C#学习教程,希望你多多关注——(),StringSplitOptions.RemoveEmptyEntries));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
