您有 3 个选项:
使用其他人在此处推荐的字符串以低效的方式执行此操作。
对Regex 对象使用.Matches() 调用,并模拟.Replace() 的工作方式(参见#3)。
调整 Regex 的 Mono 实现以构建一个接受 StringBuilder 的 Regex。几乎所有的工作都已经在 Mono 中为您完成了,但是需要时间来找出使其在自己的库中工作的部分。 Mono 的 Regex 利用了 Novell 2002 年对 Regex 的 JVM 实现,这很奇怪。
扩展上述内容:
2。模拟替换()
您可以通过调用.Matches() 来模仿LTRReplace 的行为,跟踪您在原始字符串中的位置并循环:
var matches = regex.Matches(original);
var sb = new StringBuilder(original.Length);
int pos = 0; // position in original string
foreach(var match in matches)
{
// Append the portion of the original we skipped
sb.Append(original.Substring(pos, match.Index));
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));
但是,这只会为您节省一些字符串 - Mono 方法是唯一真正彻底消除字符串的方法。
3。单声道
这个答案自 2014 年以来一直没有出现,我从未在 cmets 或搜索中看到基于 StringBuilder 的 Regex 土地。因此,为了让事情顺利进行,我从 Mono 中提取了 Regex impl 并将其放在这里:
https://github.com/brass9/RegexStringBuilder
然后我创建了一个接口 IString 以允许更松散地传递输入和输出 - string、StringBuilder 和 char[] 分别包装在一个实现 IString 的类中。
结果并不快 - Microsoft 高度优化的代码运行 10,000 次简单替换,比此代码快约 6 倍。但是,我没有做任何优化它,尤其是在消除底层代码中更深层次的字符串(在某些情况下它转换为字符串以运行 .ToLower() 只是为了返回 char 数组)。
欢迎投稿。下面讨论了从 2014 年开始代码在 Mono 中的工作方式(就在它从 Mono 中删除之前不久,用于 Microsoft 基于字符串的实现):
System.Text.RegularExpressions.Regex 使用RxCompiler 以RxInterpreterFactory 的形式实例化IMachineFactory,这毫不奇怪使IMachines 成为RxInterpreters。让它们发射是您需要做的大部分事情,尽管如果您只是想了解它是如何为效率而构建的,那么值得注意的是,您正在寻找的大部分内容都在它的基类中,BaseMachine。
特别是在BaseMachine 中是基于StringBuilder 的东西。在方法LTRReplace 中,它首先用初始字符串实例化一个StringBuilder,从那里开始的一切都是纯粹基于StringBuilder 的。如果我们假设内部 Microsoft .Net 实现是相似的,那么 Regex 没有 StringBuilder 方法,这实际上很烦人。