【发布时间】:2009-12-05 22:19:47
【问题描述】:
我需要在文本中找到以 [ 开头并以 ] 结尾的所有内容,并将其替换为函数返回的值。所以,这是我正在做的一个例子:
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很慢。
我该如何改进它?
谢谢。
【问题讨论】:
-
我不明白是什么导致您放弃了第一种方法,这似乎是正确的解决方案。你能详细说明一下吗?
-
马克说得对:这正是 MatchEvaluator 的用途。另外,如果你想要第一个捕获组的内容,
match.Groups[1]比match.Result("$1")效率更高。
标签: c# regex performance replace