我有一个大字符串,它可能包含以下内容:
<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);
答案 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 page,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 */);