Мне нужно найти в тексте все, что начинается с [и заканчивается на], и заменить его значением, которое возвращает функция. Итак, вот пример того, что я делаю:
public string ProcessTemplate(string input)
{
return Regex.Replace(input, @"\[(.*?)\]", new MatchEvaluator(delegate(Match match)
{
return ProcessBlock(match.Result("$1"));
}));
}
public string ProcessBlock(string value)
{
return Block.FromString(value).Process();
}
Теперь моя проблема - когда мне нужно редактировать блоки. Поэтому я подумал найти блоки, отредактировать их и затем заменить их в тексте.
Итак, я создал список блоков и разделил метод ProcessTemplate
на два метода: FindBlocks
и ReplaceBlocks
:
public void FindBlocks(string input)
{
Input = input;
foreach (Match match in Regex.Matches(input, @"\[(.*?)\]"))
Blocks.Add(Block.FromString(match.Result("$1")));
}
public string ReplaceBlocks()
{
string input = Input;
foreach (Block block in Blocks)
input = input.Replace("[" + block.OrginalText + "]", block.Process);
return input;
}
public IList<Block> Blocks
{
get;
set;
}
public string Input
{
get;
set;
}
Это работает, но проблема в том, что это довольно медленно. Я измерил System.Diagnostics.Stopwatch
каждую часть и обнаружил, что String.Replace
в методе ReplaceBlocks
довольно медленный.
Как я могу улучшить это?
Спасибо.