Мне нужно найти в тексте все, что начинается с [и заканчивается], и заменить его значением, возвращаемым функцией. Итак, вот пример того, что я делаю:Замена коллекции соответствия регулярных выражений в C#
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
довольно медленный.
Как его улучшить?
Спасибо.
Я не понимаю, почему вы отказались от своего первого метода, который кажется правильным решением. Можете ли вы уточнить? –
Право Марка: это именно то, для чего предназначен MatchEvaluator. Кроме того, если вы хотите, чтобы содержимое первой группы захвата, 'match.Groups [1]' намного эффективнее, чем 'match.Result (« $ 1 »)'. –