Использование Regex для редактирования строки в C # - PullRequest
1 голос
/ 23 января 2009

Я только начинаю использовать Regex, так что терпите мою терминологию. У меня есть шаблон регулярных выражений, который работает правильно на строке. Строка может быть в формате «текст [шаблон] текст». Поэтому у меня также есть шаблон регулярных выражений, который отрицает первый шаблон. Если я распечатываю результаты каждого матча, все отображается правильно.

Проблема в том, что я хочу добавить текст в строку, и это изменяет индекс совпадений в регулярном выражении MatchCollection. Например, если я хочу заключить найденное совпадение в теги "td" match "/ td" ", у меня есть следующий код:

Regex r = new Regex(negRegexPattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
            MatchCollection mc = r.Matches(text);
            if (mc.Count > 0)
            {
                for (int i = 0; i < mc.Count; i++)
                {
                    text = text.Remove(mc[i].Index, mc[i].Length);
                    text = text.Insert(mc[i].Index, "<td>" + mc[i].Value + "</td>");
                }                
            }

Это прекрасно работает для первого матча. Но, как и следовало ожидать, mc [i] .Index больше не действителен, потому что строка изменилась. Поэтому я попытался найти только одно совпадение в цикле for для ожидаемого количества совпадений (mc.Count), но затем продолжаю находить первое совпадение.

Так что, надеюсь, не вводя больше регулярных выражений, чтобы убедиться, что это не первое совпадение, и сохраняя все в одной строке, есть ли у кого-нибудь мнение о том, как я могу это сделать? Спасибо за ваш вклад.

Редактировать: Спасибо всем за ваши ответы, я ценю их всех.

Ответы [ 5 ]

3 голосов
/ 23 января 2009

Это может быть просто: -

  string newString = Regex.Replace("abc", "b", "<td>${0}</td>");

Результаты в a<td>b</td>c.

В вашем случае: -

Regex r = new Regex(negRegexPattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
text = r.Replace(text, "<td>${0}</td>");

Заменит все вхождение negRegexPattern содержимым этого совпадения, окруженным элементом td.

2 голосов
/ 23 января 2009

Хотя я согласен с тем, что ответ Regex.Replace выше является лучшим выбором, просто чтобы ответить на заданный вами вопрос, как насчет замены с последнего матча на первый. Таким образом, ваша строка выходит за пределы «предыдущего» совпадения, поэтому индексы с более ранними совпадениями будут по-прежнему действительны.

for (int i = mc.Count - 1; i > 0; --i)
1 голос
/ 23 января 2009

Вы можете попробовать что-то вроде этого:

Regex.Replace(input, pattern, match =>
{
   return "<tr>" + match.Value + "</tr>";
});
1 голос
/ 23 января 2009
   static string Tabulate(Match m) 
   {
      return "<td>" + m.ToString() + "</td>";
   }

   static void Replace() 
   {
      string text = "your text";
      string result = Regex.Replace(text, "your_regexp", new MatchEvaluator(Tabulate));
   }
0 голосов
/ 23 января 2009

Сохраняйте счетчик до начала цикла и добавляйте количество символов, которое вы вставляете каждый раз. IE:

            Regex r = new Regex(negRegexPattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
            MatchCollection mc = r.Matches(text);

                int counter = 0;
                for (int i = 0; i < mc.Count; i++)
                {
                    text = text.Remove(mc[i].Index + counter, mc[i].Length);
                    text = text.Insert(mc[i].Index + counter, "<td>" + mc[i].Value + "</td>");
                    counter += ("<td>" +  "</td>").Length;
                }

Я не проверял это, но оно ДОЛЖНО работать.

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