Замена Regex Match Collection в C # - PullRequest
       15

Замена Regex Match Collection в C #

1 голос
/ 06 декабря 2009

Мне нужно найти в тексте все, что начинается с [и заканчивается на], и заменить его значением, которое возвращает функция. Итак, вот пример того, что я делаю:

    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 довольно медленный.

Как я могу улучшить это?

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 декабря 2009

замена строки в 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();

Я также нашел замену циклов foreach на цикл for, которые быстрее.

0 голосов
/ 06 декабря 2009

Я думаю, что это медленно

Не оптимизируйте, пока не профилируете. Узнайте, почему ваш код работает медленно, а затем оптимизируйте эти части.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...