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

本文关键字:文本 字符串 替换 正则表达式 | 更新日期: 2023-09-27 18:28:23

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

<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); 

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

那。。。

  • 要匹配的Regex:class='"[A-Za-z0-9_'-]+'"
  • 替换为:class='"'"

这样,我们就忽略了第一部分(id="Specs"等)只需替换类名。。。一无所有。

看起来像是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()    

如果您的输入不符合XML,而大多数HTML都不符合,那么您可以使用HTML敏捷包来解析HTML并操作内容。有了HTML Agility PAck,再加上Linq或Xpath,属性的顺序就不再重要了(使用Regex时也是如此),解决方案的整体稳定性也大大提高。

使用HTML敏捷包(项目页面,nuget),这就完成了任务:

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 */);