替换匹配元素,包括嵌套元素

时间:2015-09-15 07:26:41

标签: c# regex

我需要替换span id="comment_n" n的所有出现,其中span可以是任意数字,并且此符合条件的span的任何出现都可以嵌套。每个foo <span id="comment_1">text <span id="comment_2" attr="value">text.</span></span> bar 可以具有不同的属性。例如:

<span id="comment_\d+.+?<\/span>

我有这个正则表达式:

span

但它不包括最后一个结束Regex.Replace(input, regex, string.Empty, RegexOptions.Multiline | RegexOptions.IgnoreCase); 标记。

我需要做一个替换:

TableRoom
- NoRoom
- Status

演示:http://regexr.com/3bpkf

2 个答案:

答案 0 :(得分:2)

我建议使用HtmlAgilityPack来获取所需内容。您可以指定XPath以仅获取具有<span>属性的id标记,该属性以comment_开头(不区分大小写),然后将其删除。使用正则表达式或不使用正则表达式可以对comment_后的数字进行额外检查。这是一种删除某些具有特定属性值的标记的方法,其中使用正则表达式检查此值。

public string HtmlAgilityPackRemoveTagsWithSpecificAttribute(string html, string xpath, string attribute_name, Regex rx)
{
    HtmlAgilityPack.HtmlDocument hap;
    Uri uriResult;
    if (Uri.TryCreate(html, UriKind.Absolute, out uriResult) &&
                              uriResult.Scheme == Uri.UriSchemeHttp)
    { // html is a URL 
        var doc = new HtmlAgilityPack.HtmlWeb();
        hap = doc.Load(uriResult.AbsoluteUri);
    }
    else
    { // html is a string
        hap = new HtmlAgilityPack.HtmlDocument();
        hap.LoadHtml(html);
    }
    var nodes = hap.DocumentNode.SelectNodes(xpath);
    if (nodes != null)
    {
       foreach (var node in nodes)
       {
           if (rx.IsMatch(node.Attributes[attribute_name].Value))
               node.ParentNode.RemoveChild(node);
       }
    }
    return hap.DocumentNode.OuterHtml;
}

你可以像这样使用它:

var res = HtmlAgilityPackRemoveTagsWithSpecificAttribute(html,
  "//span[starts-with(translate(@id, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
           'abcdefghijklmnopqrstuvwxyz'), 'comment_')]", "id", 
                new Regex("(?i)^comment_[0-9]+$"));

请注意,translate用于启用不区分大小写的比较(comment_COMMENT_等)。如果您不需要,只需使用starts-with(@id, 'comment_')]"

如果你多次使用它,可以在传递给方法之前实例化正则表达式,或者使用静态Regex.IsMatch并替换方法签名。

答案 1 :(得分:-1)

至于为什么它不包含最后一个结束span标记,这是因为你的正则表达式模式中的?,这使得它“懒惰”导致它要匹配最短的满意字符串,如果删除它,匹配将包含最后一个'span'标记:

<span id="comment_\d+.+<\/span>

但我建议使用HtmlAgilityPack来解析你的DOM并对其进行操作。