1

清理完后,我得到了一堆空标签。我想删除它们,但到目前为止我一直在使用的表达式:

Regex.Replace(clean, "(<[/a-zA-Z]+?)([^>]*?)(>)", "$1$3");

我在这里看到了一个讨论,但并没有让我清楚。我如何确保标签的第一个和第二个发现的内容是相同的(将它们匹配在一起)除了斜杠?

4

4 回答 4

3

您可以使用反向引用来确保结束元素的名称与开始标签的名称匹配。这是我通过扩展 Konrad 的解决方案得到的模式:

result = Regex.Replace(input, @"<([^>/][^>]*)></\1>", String.Empty);

这里\1指的是模式中匹配的第一个组,由模式中的括号表示,括号包围着开始元素的名称。

于 2013-03-23T23:52:45.223 回答
2

我认为您无需检查它们是否属于同一种类。这是假设您有一个有效的 XML 结构。如果是这样,表格上就不能有任何东西:

<someTagStarts></anOtherTagEnds>

所以你可以使用下面的正则表达式。

Regex.Replace(input, "<[^>/][^>]*></[^>]*>", "");

我也找到了这个链接,但我不确定他们为什么在结束标记处使用加号而不是星号。最好问一下。

意识到您甚至可能需要删除看似空的标签(它们包含空白空间和类似的东西),我可以反弹新浪的解决方案并添加以下内容)。

Regex.Replace(input, @"<([^>/][^>]*)>((&nbsp;)*|\s*)</\1>", String.Empty);

就在这里的某个地方,我们从可爱到讨厌的正则表达式体验。:)

于 2013-03-23T23:39:38.030 回答
1

这将是一个迟到的答案,但正如我在您之前的问题中所说:

不要尝试用正则表达式解析 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>
于 2013-03-31T17:44:04.987 回答
0

我找到了一种删除所有标签的方法(有没有类)

我发现的正则表达式解决方案是:

<\s*[^>/]*>((&nbsp;)*|\s*)</\s*[^></]*>

看下面的例子:

<span class="test1"></span> <span class= "test2">That´s a text</span>

该正则表达式只会删除Test2类。

我希望这对你有帮助!:)

于 2019-09-10T14:40:00.550 回答