清理完毕后,我最终得到了一堆空标签。我想删除它们,但我一直在使用的表达方式:
Regex.Replace(clean, "(<[/a-zA-Z]+?)([^>]*?)(>)", "$1$3");
我看过here的讨论,但它并没有让我清楚。如何确保标记的第一个和第二个发现的内容是相同的(将它们匹配在一起)除了斜杠?
答案 0 :(得分:3)
您可以使用反向引用来确保结束元素的名称与开始标记的名称相匹配。这是我通过扩展Konrad的解决方案获得的模式:
result = Regex.Replace(input, @"<([^>/][^>]*)></\1>", String.Empty);
这里\1
指的是模式中匹配的第一个组,它由模式中的括号表示,它围绕着开放元素的名称。
答案 1 :(得分:2)
我认为您不需要检查它们是否属于同一类型。这假设你有一个有效的XML结构。如果是这样,表格上就没有任何内容:
<someTagStarts></anOtherTagEnds>
所以你可以使用以下正则表达式。
Regex.Replace(input, "<[^>/][^>]*></[^>]*>", "");
我还找到了this link,但我不确定为什么他们在结束标记处使用加号而不是星号。最好问一下。
意识到您可能需要删除看似空的标签(它们包含空白空间和类似的东西),我可以反弹新浪的解决方案并添加以下内容。
Regex.Replace(input, @"<([^>/][^>]*)>(( )*|\s*)</\1>", String.Empty);
在这里,我们从可爱到令人讨厌的正则表达式体验。 :)
答案 2 :(得分:1)
这将是一个迟到的答案,但正如我在previous question中所说的那样:
Don't try to parse xml/html with regex, use a real xml parser to process xmls
Altought,它可以用于一些简单的情况,它会在维护和处理极端情况时带来更多麻烦。
使用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>
答案 3 :(得分:0)
我找到了一种方法来删除所有空标签(有无类)
我发现的正则表达式解决方案是:
<\s*[^>/]*>(( )*|\s*)</\s*[^></]*>
看下面的例子:
<span class="test1"></span>
<span class= "test2">That´s a text</span>
该Regex只会删除 Test2 类。
希望对您有所帮助! :)