用C#替换正则表达式匹配集合

时间:2009-12-05 22:19:48

标签: c# regex performance replace

我需要在文本中找到以[并以]结尾的所有内容,并将其替换为函数返回的值。所以,这是我正在做的一个例子:

    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方法分为两个方法:FindBlocksReplaceBlocks

    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非常慢。

我该如何改进?

感谢。

2 个答案:

答案 0 :(得分:1)

将ReplaceBlock中的字符串替换为StringBuilder可能会提高性能,因为每次执行string.replace时都必须释放字符串并重新分配字符串。字符串生成器不需要这样做。

使用以下内容替换ReplaceBlock的内容。

// This will require a reference to System.Text
StringBuilder input =new StringBuilder(Input);
  foreach (Block block in Blocks)
  {
    input = input.Replace("[" + block.OrginalText + "]", block.Process);
  }
  return input.ToString();

我还发现用for循环替换foreach循环更快。

答案 1 :(得分:0)

  

我觉得它很慢

在您进行分析之前不要进行优化。找出代码缓慢的原因,然后优化这些部分。

http://c2.com/cgi/wiki?ProfileBeforeOptimizing