使用正则表达式匹配和替换文本中的字符串

时间:2012-03-20 02:03:36

标签: c# regex replace html-agility-pack

我有一个大字符串,它可能包含以下内容:

<div id="Specs" class="plinks">
<div id="Specs" class="plinks2">
<div id="Specs" class="sdfsf">
<div id="Specs" class="ANY-OTHER_NAME">

如何将字符串中的值从上面的任何内容替换为:

<div id="Specs" class="">

这是我提出的,但它不起作用:

        string source = "bunch of text";
        string regex = "<div id=\"Specs\" class=[\"']([^\"']*)[\"']>";
        string regexReplaceTo = "<div id=\"Specs\" class=\"\">";
        string output = Regex.Replace(source, regex, regexReplaceTo); 

3 个答案:

答案 0 :(得分:4)

怎么样......

  • 要匹配的正则表达式:class=\"[A-Za-z0-9_\-]+\"
  • 替换为:class=\"\"

这样,我们忽略了第一部分(id="Specs"等)和 只需替换类名......什么也不用。

答案 1 :(得分:4)

看起来像http://www.codinghorror.com/blog/2008/06/regular-expressions-now-you-have-two-problems.html的另一个案例。使用Regex的以下有效标记会发生什么?

<div class="reversed" id="Specs">            
<div  id="Specs"  class="additionalSpaces" >     
<div id="Specs" class="additionalAttributes" style="" >

我没有看到使用Linq2Xml如何使用任何组合:

XElement root = XElement.Parse(xml); // XDocument.Load(xmlFile).Root 
var specsDivs = root.Descendants()
                    .Where(e => e.Name == "div"
                           && e.Attributes.Any(a => a.Name == "id")
                           && e.Attributes.First(a => a.Name == "id").Value == "Specs"
                           && e.Attributes.Any(a => a.Name == "class"));
foreach(var div in specsDivs)
{
  div.Attributes.First(a => a.Name == "class").value = string.Empty;
}
string newXml = root.ToString()    

答案 2 :(得分:2)

如果您的输入不符合XML,而大多数HTML不是,那么您可以使用HTML Agility Pack来解析HTML并操纵内容。使用HTML Agility PAck,结合Linq或Xpath,您的属性顺序不再重要(当您使用Regex时它会这样做)并且您的解决方案的整体稳定性会增加很多。

使用HTML Agility Pack(project pagenuget),可以解决这个问题:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes("div").Where(div => div.Id == "Specs");

foreach (var node in nodes)
{
    var classAttribute = node.Attributes["class"];
    if (classAttribute != null)
    {
        classAttribute.Value = string.Empty;
    }
}

var fixedText = doc.DocumentNode.OuterHtml;
//doc.Save(/* stream */);