当前位置: 首页 > 编程语言 > C#

用坏字符替换字符串中的错误字符分享

时间:2023-04-10 18:36:51 C#

用坏字符替换字符串中的错误字符例如:varstr="[HelloWorld]";//用方括号[]括起所有出现的[和]str=str.Replace("","[[]").Replace("]","[]]");原因很明显是第二次替换已经修改过的字符串。那么如何用包含“坏”字符的字符替换所有出现的“坏”字符呢?对所有方法的快速测量表明StringBuilder是最有效的方法。190kb文件(全部以毫秒为单位)regexTime40.5065replaceTime20.8891stringBuilderTime6.97767MB文件regexTime1209.3529replaceTime403.3985stringBuilderTime175.2583顺便说一句,John的直接StringBuilder方法比Sehe的Aggregate方法快两倍。我做了一个扩展:publicstaticStringEncloseChars(thisstringinput,char[]charsToEnclose,StringleftSide,StringrightSide){if(charsToEnclose==null||leftSide==null||rightSide==null)thrownewArgumentException("EncloseChars的无效参数",charsToEnclose==null?"charsToEnclose":leftSide==null?"leftSide":"rightSide");Array.Sort(charsToEnclose);StringBuildersb=newStringBuilder();foreach(charcininput){if(Array.BinarySearch(charsToEnclose,c)>-1)sb.Append(leftSide).Append(c).Append(rightSide);否则sb.Append(c);}返回sb.ToString();}"[HelloWorld]".EncloseChars(newchar[]{'[',']'},[","]");这是一种很不酷的方式。但我认为它的优点是非常接近万无一失,而且不使用正则表达式(如果你不想的话)。StringBuildersb=newStringBuilder();foreach(charcinstr.ToCharArray()){if(c=='['||c==']'){sb.Append('['+c+']');}else{sb.Append(c);}}字符串结果=sb.ToString();怎么样:str=str.Replace("[","$1[$2").Replace("]","$1]$2").Replace("$1","[").Replace("$2","]");这个优雅的正则表达式方法怎么样:Regex.Replace("[HelloWorld]",@"[[]]","[$0]");单元测试?[TestMethod]publicvoidUnitTestThat(){Assert.AreEqual(@"[[]HelloWorld[]]",Regex.Replace("[HelloWorld]",@"[[]]","[$0]"));通过测试编辑@JohnMcGrant这是代码的一个效率稍低的版本,顺便说一下,它与上面的正则表达式完全相同:stringresult=input.Aggregate(newStringBuilder(),(a,c)=>-1!="[]".IndexOf(c)?a.AppendFormat("[{0}]",c):a.Append(c)).ToString();怎么样:char[]replacedChars=str.SelectMany(ch=>(ch=='['?newchar[]{'[','[',']'}:(ch==']'?newchar[]{'[',']',']'}:newchar[]{ch}))).ToArray();替换的字符串=新字符串(replacedChars);请注意,这避免了多循环问题,但创建了一个数组,其字符数至少与输入字符串中的相同字符数一样多很多,所以在性能方面可能不是最佳的StringBuilder结果=newStringBuilder();foreach(CharsingleCharacterinstr){结果。追加(singleCharacter.Equals('[')?“[[]”:singleCharacter.Equals(']')?“[]]”:singleCharacter.ToString());}str=result.ToString();我遇到了完全相同的问题,所以我做了一个辅助函数来做这个如果它对你有用,你需要了解更多关于C#学习教程,我希望你多关注它——protectedstringReplaceUsingDictionary(stringsubject,字典对){StringBuildersb=newStringBuilder(subject);sb.Replace("{","{{").Replace("}","}}");诠释我=0;foreach(成对的字符串键.Keys.ToArray()){sb.Replace(key.Replace("{","{{").Replace("}","}}"),"{"+i+“}”);我++;}returnstring.Format(sb.ToString(),pairs.Values.ToArray());}//用法Dictionaryreplacements=newDictionary();替换[["]="[[]";替换[“]”]=“[]]”;stringmystr=ReplaceWithDictionary("[HelloWorld]",替换);//返回[[]HelloWorld[]]本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: