2

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

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

4 回答 4

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,看看它是否可以更简单地解决您的问题。
于 2012-05-28T13:51:10.420 回答
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;
                               }
                           }   
                        }
于 2012-05-28T13:51:09.700 回答
1
foreach(匹配中的匹配)
{
    结果=匹配。值;

    如果(结果!= 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;
        }
    }
}
于 2012-05-28T13:51:40.150 回答
0

Regex.Replace 方法不会简化您要完成的工作吗?

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.replace(v=vs.71).aspx

于 2012-05-28T13:52:19.233 回答