У вас есть 3 варианта:
Делайте это неэффективным способом со строками, как другие рекомендовали здесь.
Используйте .Matches()
вызовите ваш Regex
объект и эмулируйте работу .Replace()
(см. # 3).
Адаптируйте реализацию Mono Regex
для создания Regex
, которыйпринимает StringBuilder
(и, пожалуйста, поделитесь им здесь!) Почти вся работа уже сделана для вас в Mono, но потребуется время, чтобы выяснить, какие части заставляют ее работать в их собственной библиотеке.Regex
Mono использует реализацию JVM Novell 2002 года, как ни странно, Regex
.
В Mono:
System.Text.RegularExpressions.Regex
использует RxCompiler
для создания IMachineFactory в форме RxInterpreterFactory
, что неудивительно, что IMachine
с составляет RxInterpreter
с.Заставить их излучать - это большая часть того, что вам нужно сделать, хотя, если вы просто хотите узнать, как все это структурировано для повышения эффективности, значительная часть того, что вы ищете, находится в базовом классе, BaseMachine
.
В частности, в BaseMachine
это материал, основанный на StringBuilder
.В методе LTRReplace
он сначала создает экземпляр StringBuilder с исходной строкой, и все, что оттуда, основано исключительно на StringBuilder.На самом деле очень досадно, что в Regex нет зависающих методов StringBuilder, если предположить, что внутренняя реализация Microsoft .Net похожа.
Возвращаясь к предложению 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));
Но это спасет вас только от некоторых строк - подход mod-Mono - единственный, который действительно делает это правильно.