StringBuilder中的正则表达式替换/替换操作。我遇到了一个问题,因为StringBuilder替换函数不能接受正则表达式参数。我可以在普通字符串上使用Regex.Replace,但我认为这是低效的,因为需要在内存中创建字符串的两个副本,因为.net字符串是不可变的。更新文本后,我打算将其写回原始文件。解决我的问题的最好和最有效的方法是什么?编辑除了下面的答案之外,我发现以下问题也解释了我的问题-你最好和最有效的解决方案是首先尝试最简单的方法:忘记StringBuilder并使用Regex.Replace。然后找出它有多慢——它可能已经足够好了。不要忘记在编译和非编译模式下尝试正则表达式。如果这还不够快,请考虑对任何简单表达的替换使用StringBuilder,然后使用Regex.Replace。您可能还想考虑尝试组合替换,减少使用的正则表达式(以及中间字符串)的数量。您有3个选择:使用字符串以低效的方式执行此操作,正如其他人在这里所建议的那样。在Regex对象上使用.Matches()调用,并模拟.Replace()的工作方式(参见#3)。调整Regex的Mono实现以构建接受StringBuilder的Regex(请在此处分享!)几乎所有工作都已在Mono中为您完成,但需要时间来处理使其工作的部分。自己的库奇怪的是,Mono的常规Regex使用Novell的2002JVMRegex实现。在mono中:System.Text.RegularExpressions.Regex使用RxCompiler以RxInterpreterFactory的形式实例化RxInterpreterFactory,这不出所料地让IMachine成为了一个RxInterpreter。获得这些排放量是您需要做的大部分工作,但如果您只是想了解它是如何为提高效率而设计的,那么您正在寻找的很多东西都在其基类BaseMachine中。特别是当BaseMachine基于StringBuilder的东西时。在方法LTRReplace中,它首先用一个初始字符串实例化一个StringBuilder,从那里开始的所有内容都是纯粹基于StringBuilder的。如果我们假设内部Microsoft.Net实现是相似的,那么Regex没有挂在StringBuilder方法上实际上是很烦人的。回到建议2,您可以通过调用.Matches()来模仿LTRReplace的行为,跟踪您在原始字符串中的位置并循环:varmatches=regex.Matches(original);varsb=newStringBuilder(original.Length);int位置=0;//在原始字符串中的位置foreach(varmatchinmatches){sb.Append(original.Substring(pos,match.Index));//追加我们跳过的原始部分pos=match.Index;//对匹配结果进行任何你喜欢的操作,比如你自己的自定义替换,甚至运行另一个Regexpos+=match.Value.Length;}sb.Append(original.Substring(pos,original.Length-1));但是,这只会为您节省一些字符串——mod-Mono方法是真正正确处理的唯一方法。我不确定这是否对您的方案有帮助,但我遇到了一些内存消耗上限和正则表达式,我需要在StringBuilder上使用简单的通配符替换扩展方法来推动。如果您需要复杂的正则表达式匹配和/或反向引用,这是不行的,但如果是简单的*或?通配符替换(“用文字替换”文本)将为您完成这项工作,那么我的问题末尾的解决方法至少应该给您一个提升:有没有人围绕StringBuilders或Streams实现了正则表达式和/或Xml解析器?这是您可以用来做您想做的事情的扩展方法。它接受一个字典,其中键是您要查找的模式,值是您想要替换它的值。您仍然可以创建传入字符串的副本,但只需处理一次,而不是为多次调用Regex.Replace创建副本。以上就是《C#学习教程:StringBuilder中的正则表达式替换》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——publicstaticStringBuilderBulkReplace(thisStringBuildersource,IDictionaryreplacementMap){if(source.Length==0||replacementMap.计数==0){返回源;}stringreplaced=Regex.Replace(source.ToString(),String.Join("|",replacementMap.Keys.Select(Regex.Escape).ToArray()),m=>replacementMap[m.Value],RegexOptions.忽略大小写);返回source.Clear().Append(replaced);}本文收集自网络,不代表立场。侵权请点击右侧联系管理员删除。如需转载请注明出处:
