ipr*_*101 21 c# regex stringbuilder
我正在将文本文件的内容写入StringBuilder,然后我想使用正则表达式对StringBuilder中包含的文本执行许多查找/替换操作.
我遇到了一个问题,因为StringBuilder替换函数不能接受正则表达式参数.
我可以在普通字符串上使用Regex.Replace,但我认为这是低效的,因为由于.net字符串是不可变的,因此需要在内存中创建两个字符串副本.
一旦我更新了文本,我打算将其写回原始文件.
什么是解决我问题的最佳和最有效的方法?
编辑
除了下面的答案,我发现以下问题也解释了我的问题 -
Jon*_*eet 28
适合您的时间的最佳和最有效的解决方案是首先尝试最简单的方法:忘记StringBuilder并使用Regex.Replace.然后找出它有多慢 - 它可能已经足够好了.不要忘记在编译和非编译模式下尝试正则表达式.
如果这还不够快,请考虑使用a StringBuilder表示您可以简单表达的任何替换,然后使用Regex.Replace其余部分.您可能还想考虑尝试组合替换,减少使用的正则表达式(以及因此中间字符串)的数量.
您有3种选择:
像其他人在这里建议的那样,以低效的方式对字符串执行此操作。
.Matches()在Regex对象上使用调用,并模拟其工作方式.Replace()(请参阅#3)。
改编的Mono实现Regex以构建一个Regex接受StringBuilder(并在此处共享!)的对象,几乎所有的工作都已经在Mono中为您完成,但是要花费一些时间来使使其工作的部分放到自己的库中。Mono Regex充分利用Novell的2002 JVM实现Regex。
在单声道中:
System.Text.RegularExpressions.Regex使用RxCompiler实例化IMachineFactory的形式为RxInterpreterFactory,毫不奇怪地使IMachines为RxInterpreters。使这些问题得以解决是您需要做的大部分事情,尽管如果您只是想学习如何有效地构建它们,值得注意的是,您所寻找的很多东西都在其基类中BaseMachine。
尤其BaseMachine是StringBuilder基于的东西。在方法中LTRReplace,它首先使用初始字符串实例化StringBuilder,从此以后的所有内容都完全基于StringBuilder。如果我们假设内部的Microsoft .Net实现是相似的,那么Regex并没有使用StringBuilder方法是非常令人讨厌的。
回到建议2,您可以LTRReplace通过调用.Matches(),跟踪您在原始字符串中的位置以及循环来模仿行为:
var matches = regex.Matches(original);
var sb = new StringBuilder(original.Length);
int pos = 0; // position in original string
foreach(var match in matches)
{
sb.Append(original.Substring(pos, match.Index)); // Append the portion of the original we skipped
pos = match.Index;
// Make any operations you like on the match result, like your own custom Replace, or even run another Regex
pos += match.Value.Length;
}
sb.Append(original.Substring(pos, original.Length - 1));
Run Code Online (Sandbox Code Playgroud)
但是,这只会为您节省一些字符串-mod-Mono方法是唯一真正做到这一点的方法。
| 归档时间: |
|
| 查看次数: |
16345 次 |
| 最近记录: |