Java regex 去除 XML 标签,但不去除标签内容

Posted

技术标签:

【中文标题】Java regex 去除 XML 标签,但不去除标签内容【英文标题】:Java regex to strip out XML tags, but not tag contents 【发布时间】:2013-03-24 00:54:11 【问题描述】:

我有以下 Java 代码:

str = str.replaceAll("<.*?>.*?</.*?>|<.*?/>", "");

这会变成这样的字符串:

How now <fizz>brown</fizz> cow.

进入:

How now  cow.

但是,我希望它只删除 &lt;fizz&gt;&lt;/fizz&gt; 标记,或者只是独立的 &lt;/fizz> 标记,并保留元素的内容。因此,一个正则表达式会将上述内容变为:

How now brown cow.

或者,使用更复杂的字符串,会变成这样:

How <buzz>now <fizz>brown</fizz><yoda/></buzz> cow.

进入:

How now brown cow.

我试过了:

str = str.replaceAll("<.*?></.*?>|<.*?/>", "");

这根本行不通。有任何想法吗?提前致谢!

【问题讨论】:

通常如果xmlregex标签一起显示,你会得到一个评论,它说...... 您是否尝试过使用 XML 解析器?我发现使用 JDOM 解析 XML 让我的生活更轻松。 如果不进入一个巨大的背景故事,我就无法详细介绍,但这在这里是不可能的(XML Parser)。只是在寻找正则表达式解决方案。 放一个'|'在第一个 > 和 <.> 之间 如果您真的想使用正则表达式,请不要在问题中提及任何 xml,而只需说“文本”,:D ...您可以尝试replaceAll("&lt;[^&gt;]*&gt;","") 【参考方案1】:

如果您想解析 XML 日志文件以便可以使用正则表达式 java,&lt;[^&lt;]+&lt;.so 你会得到&lt;name&gt;DEV&lt;/name&gt;。输出如名称> DEV。您只需要使用 REGEX。

【讨论】:

【参考方案2】:

这并不优雅,但很容易理解。如果它们一起出现在一行中,下面的代码将删除开始和结束 XML 标记

&lt;url&gt;"www.xml.com"&lt;\url&gt; , &lt;body&gt;"This is xml"&lt;\body&gt;

正则表达式:

to_replace='<\w*>|<\/\w*>',value="" 

【讨论】:

【参考方案3】:

你也可以试试这个:

str = str.replaceAll("<.*?>", "");

请查看以下示例以更好地理解:

public class StringUtils 

    public static void main(String[] args) 
        System.out.println(StringUtils.replaceAll("How now <fizz>brown</fizz> cow."));
        System.out.println(StringUtils.replaceAll("How <buzz>now <fizz>brown</fizz><yoda/></buzz> cow."));
    

    public static String replaceAll(String strInput) 
        return strInput.replaceAll("<.*?>", "");
    

输出:

How now brown cow.
How now brown cow.

【讨论】:

-1。尖括号(&lt;&gt;)在正则表达式中没有特殊含义,因此转义它们是没有意义的。事实上,在某些风格(但不是 Java)中,\&lt;\&gt; 用于匹配单词边界,因此这种“解决方案”会使事情变得更糟。【参考方案4】:

虽然还有其他正确答案,但没有一个给出任何解释。

您的正则表达式&lt;.*?&gt;.*?&lt;/.*?&gt;|&lt;.*?/&gt; 不起作用的原因是它会选择任何标签以及其中的所有内容。您可以在 debuggex 上看到这一点。

您的第二次尝试&lt;.*?&gt;&lt;/.*?&gt;|&lt;.*?/&gt; 不起作用的原因是它会从标签的开头选择一直到标签后面的第一个结束标签。这有点拗口,但你可以更好地理解in this example 发生了什么。

您需要的正则表达式要简单得多:&lt;.*?&gt;。它只是选择每个标签,忽略它是否打开/关闭。 Visualization.

【讨论】:

【参考方案5】:

你快到了;)

试试这个:

str = str.replaceAll("<.*?>", "")

【讨论】:

我用 Notepad++ 对其进行了测试,结果完美无缺。【参考方案6】:
"How now <fizz>brown</fizz> cow.".replaceAll("<[^>]+>", "")

【讨论】:

非常高效和紧凑。

以上是关于Java regex 去除 XML 标签,但不去除标签内容的主要内容,如果未能解决你的问题,请参考以下文章

Python从文档中去除XML标签

去除标签的xml文档,删除换行符并添加自定义换行符

Python读取文件去除html&xml标签格式

使用 RegEx 去除 C++ 中的多行注释

java 如何去除html中的一个指定标签和指定标签里的内容

java去除文本内容的标签跟