我需要在文本中找到以[開頭並且以]結尾的所有內容,並將其替換爲函數返回的值。所以,這裏是我正在做的一個例子:替換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
每個部分進行了測量,我發現ReplaceBlocks
方法中的String.Replace
非常慢。
我該如何改進?
謝謝。
我不明白是什麼導致你放棄你的第一種方法,似乎是正確的解決方案。你能詳細說明嗎? – 2009-12-05 22:30:50
馬克的權利:這正是MatchEvaluator的用途。另外,如果你想要第一個捕獲組的內容,'match.Groups [1]'比'match.Result(「$ 1」)'更有效率。 – 2009-12-06 08:48:52