使用Regex在C#中编辑字符串

时间:2009-01-23 20:13:47

标签: c# .net regex

我刚刚开始使用正则表达式,所以请遵守我的术语。我有一个在字符串上正常工作的正则表达式模式。字符串可以采用“text [pattern] text”格式。因此,我也有一个正则表达式模式,否定第一个模式。如果我打印出每个匹配的结果,则所有内容都会正确显示。

我遇到的问题是我想在字符串中添加文本,它会更改正则表达式MatchCollection中的匹配索引。例如,如果我想将找到的匹配括在“td”匹配“/ 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 个答案:

答案 0 :(得分:3)

可以这么简单: -

  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元素包围的匹配内容。

答案 1 :(得分:2)

虽然我同意上面的Regex.Replace答案是最好的选择,只是为了回答你问的问题,如何从最后一场比赛换到第一场比赛。这样你的字符串就会超出“previous”匹配,所以早期的匹配索引仍然有效。

for (int i = mc.Count - 1; i > 0; --i)

答案 2 :(得分:1)

   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));
   }

答案 3 :(得分:1)

您可以尝试这样的事情:

Regex.Replace(input, pattern, match =>
{
   return "<tr>" + match.Value + "</tr>";
});

答案 4 :(得分:-2)

在循环开始之前保留一个计数器,并添加每次插入的字符数。 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;
                }

我没有测试过这个,但它应该可以工作。