使用正则表达式在C#中编辑字符串

我刚刚开始使用正则表达式,所以忍受我的术语。 我有一个在字符串上正常工作的正则表达式模式。 该字符串可以是格式“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)的单个匹配项,但随后我一直找到第一个匹配项。

所以希望不要引入更多的正则表达式来确保它不是第一次匹配,并且将所有内容保存在一个字符串中,是否有人对我如何实现这一目标有任何意见? 感谢您的输入。

编辑:谢谢大家的回复,我很欣赏他们。


它可以像下面这样简单: -

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


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

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

   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));
   }
链接地址: http://www.djcxy.com/p/92825.html

上一篇: Using Regex to edit a string in C#

下一篇: Regular expression for email, why doesn't it work?