使用正则表达式匹配和替换文本中的字符串
本文关键字:文本 字符串 替换 正则表达式 | 更新日期: 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 */);