清理完后,我得到了一堆空标签。我想删除它们,但到目前为止我一直在使用的表达式:
Regex.Replace(clean, "(<[/a-zA-Z]+?)([^>]*?)(>)", "$1$3");
我在这里看到了一个讨论,但并没有让我清楚。我如何确保标签的第一个和第二个发现的内容是相同的(将它们匹配在一起)除了斜杠?
您可以使用反向引用来确保结束元素的名称与开始标签的名称匹配。这是我通过扩展 Konrad 的解决方案得到的模式:
result = Regex.Replace(input, @"<([^>/][^>]*)></\1>", String.Empty);
这里\1
指的是模式中匹配的第一个组,由模式中的括号表示,括号包围着开始元素的名称。
我认为您无需检查它们是否属于同一种类。这是假设您有一个有效的 XML 结构。如果是这样,表格上就不能有任何东西:
<someTagStarts></anOtherTagEnds>
所以你可以使用下面的正则表达式。
Regex.Replace(input, "<[^>/][^>]*></[^>]*>", "");
我也找到了这个链接,但我不确定他们为什么在结束标记处使用加号而不是星号。最好问一下。
意识到您甚至可能需要删除看似空的标签(它们包含空白空间和类似的东西),我可以反弹新浪的解决方案并添加以下内容)。
Regex.Replace(input, @"<([^>/][^>]*)>(( )*|\s*)</\1>", String.Empty);
就在这里的某个地方,我们从可爱到讨厌的正则表达式体验。:)
这将是一个迟到的答案,但正如我在您之前的问题中所说:
不要尝试用正则表达式解析 xml/html,使用真正的 xml 解析器来处理 xml
还好,对于一些简单的情况也可以使用,但是在维护和处理边角的情况下会带来更多的麻烦。
使用Linq To XML:
var xml = @"<root>
<notempty>text</notempty>
<empty1><empty2><empty3/></empty2></empty1>
</root>";
var xDoc = XDocument.Parse(xml);
RemoveEmptyNodes(xDoc.Root);
xDoc.Save(fileName2);
void RemoveEmptyNodes(XElement xRoot)
{
foreach (var xElem in xRoot.Descendants().ToList())
{
RemoveEmptyNodes(xElem);
if (String.IsNullOrWhiteSpace((string)xElem) && xElem.Parent!=null)
xElem.Remove();
}
}
输出将是(处理@kirmir 提到的情况)
<root>
<notempty>text</notempty>
</root>
我找到了一种删除所有空标签的方法(有没有类)
我发现的正则表达式解决方案是:
<\s*[^>/]*>(( )*|\s*)</\s*[^></]*>
看下面的例子:
<span class="test1"></span>
<span class= "test2">That´s a text</span>
该正则表达式只会删除Test2类。
我希望这对你有帮助!:)