Windows7+VS2019下如何移除StringBuilder中|与,间的字符?
嘿,我懂你遇上的麻烦了——要把StringBuilder里那些夹在|和,之间的内容删掉,对吧?之前用Substring没搞定,大概率是因为要处理好几个这样的片段,手动截取索引太容易出错了。我给你几个在VS2019里绝对能用的办法,挑你顺手的来:
方法一:正则表达式替换(最简洁)
这种方法一行替换就能搞定,特别适合快速实现需求。核心是用正则匹配所有|到下一个,之间的内容,直接替换为空:
using System.Text; using System.Text.RegularExpressions; // 初始化你的StringBuilder StringBuilder sb = new StringBuilder("578.552|0,37.986|317,38.451|356,23"); // 执行正则替换 string processedStr = Regex.Replace(sb.ToString(), @"\|[^,]+", string.Empty); // 如果还需要StringBuilder对象,重新赋值即可 sb.Clear().Append(processedStr); // 现在sb的内容就是"578.552,37.986,38.451,23"
简单解释下正则规则:\|是转义后的|(避免被正则当成特殊符号),[^,]+表示匹配任意非逗号的字符至少一次,这样就精准定位到了每个要删除的片段。
方法二:分割拼接法(逻辑清晰易调试)
如果你对正则不太熟悉,这种分步处理的方式更直观:先把字符串按逗号分割成数组,逐个处理每个元素去掉|后面的部分,最后再拼接起来:
using System.Text; StringBuilder sb = new StringBuilder("578.552|0,37.986|317,38.451|356,23"); // 按逗号分割成独立片段 string[] segments = sb.ToString().Split(','); StringBuilder resultSb = new StringBuilder(); foreach (string seg in segments) { int pipePos = seg.IndexOf('|'); if (pipePos != -1) { // 截取|前面的内容 resultSb.Append(seg.Substring(0, pipePos)); } else { // 没有|的片段直接保留 resultSb.Append(seg); } // 不是最后一个片段就加逗号 if (seg != segments[^1]) // C# 8.0及以上支持这种索引写法,VS2019默认支持 { resultSb.Append(','); } } // resultSb里就是你要的最终内容
这种方法每一步都清晰,要是调试的话能很容易看到每个片段的处理结果。
方法三:直接操作StringBuilder(高效适合大文本)
如果你的StringBuilder里内容特别大,不想反复转字符串浪费性能,可以直接在StringBuilder上循环删除目标片段:
using System.Text; StringBuilder sb = new StringBuilder("578.552|0,37.986|317,38.451|356,23"); int pipeIndex; // 循环查找所有|的位置,直到没有为止 while ((pipeIndex = sb.IndexOf("|")) != -1) { int commaIndex = sb.IndexOf(",", pipeIndex); if (commaIndex != -1) { // 删除从|开始到逗号前的内容,长度是逗号索引减去|的索引 sb.Remove(pipeIndex, commaIndex - pipeIndex); } else { // 如果后面没有逗号,说明是最后一段,直接删除|及后面的所有内容 sb.Remove(pipeIndex, sb.Length - pipeIndex); } } // 处理完成后sb就是目标内容
这种方法全程操作StringBuilder对象,避免了额外的字符串内存开销,处理大文本时优势明显。
内容的提问来源于stack exchange,提问作者Bill Yeung
相关产品推荐
相关产品推荐

