这是不关于操纵HTML的问题。我在上一篇文章中并不清楚,所以我遵循这些建议并重新发布。
我有一个长字符串,为了可视化,可以显示为XML。我正在尝试操作代码块。此外,该问题包含一个关于构造模式时我想到的步骤的列表。问题是(也)关于我哪里出错了。
我正在尝试将标签与某些名称匹配,并使用以下代码“忽略”它们。
foreach (string ignoree in ignorees)
{
Regex regex = new Regex("<" + ignoree + "[^>]*>.+</" + ignoree + ">");
text = regex.Replace(text, "&");
}
这对于简单标签来说是有效的,但对于复杂的标签来说则是失败的,即这种标签中包含子节点。至少我认为这是该问题的签名,就像我所见。
我猜这与其中一个儿童标签的闭合钳有关,但我不能为我的生活看到问题。
正则表达式是这样的:
问题是我可以匹配 cc 标记但不匹配 dd 标记。
<aa>
<bb>
<cc>c</cc>
<dd>
<ee>e</ee>
</dd>
</bb>
<bb>
<cc>c</cc>
<dd>
<ee>e</ee>
</dd>
</bb>
</aa>
<aa>
<bb>
&
<dd>
<ee>e</ee>
</dd>
</bb>
<bb>
&
<dd>
<ee>e</ee>
</dd>
</bb>
</aa>
答案 0 :(得分:1)
如果使用延迟匹配会发生什么?
Regex regex = new Regex("<" + ignoree + "[^>]*>.*?</" + ignoree + ">");
此外,您使用多行匹配吗?
如果运行以下代码:
string text = "<aa><bb><cc>c</cc><dd><ee>e</ee></dd></bb><bb><cc>c</cc><dd><ee>e</ee></dd></bb></aa> and <aa><bb>&<dd><ee>e</ee></dd></bb><bb>&<dd><ee>e</ee></dd></bb></aa>";
foreach(string ignoree in new string[] {"dd","cc"}) {
Regex regex = new Regex("<" + ignoree + "[^>]*?>.*?</" + ignoree + ">");
text = regex.Replace(text, "&");
}
Console.WriteLine(text);
结果是(格式化,缩进不是结果的一部分):
<aa>
<bb>&&</bb>
<bb>&&</bb>
</aa>
and
<aa>
<bb>&&</bb>
<bb>&&</bb>
</aa>