如何正确替换字符串

时间:2012-05-28 13:48:26

标签: c#

在我的代码中,我找到所有匹配元素并将其替换为特殊值。

Regex imgRule = new Regex("img id=\\\".+?\\\"");
                    MatchCollection matches = imgRule.Matches(content.Value);
                    string result = null;
                    foreach (Match match in matches)
                        result = match.Value;

                    if (result != null)
                    {
                        var firstOrDefault = node.ListImages.FirstOrDefault();
                        if (firstOrDefault != null)
                        {
                            var htmlWithImages = content.Value.Replace(result, string.Format("img src='{0}' class='newsimage' width='300'", firstOrDefault.ImageUrlId));
                            node.Content = htmlWithImages;
                        }
                    }

但是,我的代码是错误的,因为如果有多个匹配它只替换最后一个匹配,我如何更正我的代码以替换文本中的所有匹配?

4 个答案:

答案 0 :(得分:3)

你的for循环体周围缺少花括号。没有花括号,多次执行的唯一行是第一行。

请改为尝试:

foreach (Match match in matches)
{                                    // added curly brace here
    result = match.Value;

    if (result != null)
    {
        var firstOrDefault = node.ListImages.FirstOrDefault();
        if (firstOrDefault != null)
        {
            var htmlWithImages = content.Value.Replace(result,
                string.Format("img src='{0}' class='newsimage' width='300'",
                              firstOrDefault.ImageUrlId));
            node.Content = htmlWithImages;
        }
    }
}                                    // added curly brace here

我还想补充两点:

  • 您可以使用名为Regex.Replace的方法,而不是先使用正则表达式查找要替换的字符串,然后使用string.Replace
  • 如果您尝试解析HTML,最好使用HTML解析器。请查看HTML Agility Pack,了解它是否可以更轻松地解决您的问题。

答案 1 :(得分:1)

我想你可能会错过循环中的一组括号......

只有这一行被循环。这就是为什么你的代码只更新最后一个条目,因为结果被设置为集合中的最后一项(在foreach的最后一次迭代中)

         foreach (Match match in matches) 
                      result = match.Value;

更正后的代码

  Regex imgRule = new Regex("img id=\\\".+?\\\"");
                        MatchCollection matches = imgRule.Matches(content.Value);
                        string result = null;
                        foreach (Match match in matches) {
                            result = match.Value;

                           if (result != null)
                           {
                               var firstOrDefault = node.ListImages.FirstOrDefault();
                               if (firstOrDefault != null)
                               {
                                   var htmlWithImages = content.Value.Replace(result,    string.Format("img src='{0}' class='newsimage' width='300'", firstOrDefault.ImageUrlId));
                                   node.Content = htmlWithImages;
                               }
                           }   
                        }

答案 2 :(得分:1)

foreach (Match match in matches)
{
    result = match.Value;

    if (result != null)
    {
        var firstOrDefault = node.ListImages.FirstOrDefault();
        if (firstOrDefault != null)
        {
            var htmlWithImages = content.Value.Replace(result, string.Format("img src='{0}' class='newsimage' width='300'", firstOrDefault.ImageUrlId));
            node.Content = htmlWithImages;
        }
    }
}

答案 3 :(得分:0)