Java正则表达式去除XML标记,但不剥离标记内容

时间:2013-04-02 16:14:10

标签: java xml regex string

我有以下Java代码:

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

这会像这样变成一个字符串:

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

分为:

How now  cow.

但是,我希望它只删除<fizz></fizz>标记,或者只删除独立</fizz&gt;标签,并留下元素的内容。所以,正则表达式会将上述内容变为:

How now brown cow.

或者,使用更复杂的字符串,转变为:

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

分为:

How now brown cow.

我试过了:

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

这根本不起作用。有任何想法吗?提前谢谢!

6 个答案:

答案 0 :(得分:33)

"How now <fizz>brown</fizz> cow.".replaceAll("<[^>]+>", "")

答案 1 :(得分:6)

你几乎在那里;)

试试这个:

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

答案 2 :(得分:3)

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

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

您的第二次尝试<.*?></.*?>|<.*?/>不起作用的原因是它会从标记的开头选择标记后的第一个关闭标记。这有点拗口,但你可以更好地理解in this example上发生了什么。

您需要的正则表达式更简单:<.*?>。它只是选择每个标签,忽略它是否打开/关闭。 Visualization

答案 3 :(得分:2)

你也可以试试这个:

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.

答案 4 :(得分:1)

这不是很优雅,但是很容易理解。以下代码删除了开始和结束XML标记,如果它们同时出现在一行中

<url>"www.xml.com"<\url> , <body>"This is xml"<\body>

正则表达式:

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

答案 5 :(得分:0)

如果要解析XML日志文件,以便可以使用正则表达式{java},<[^<]+<。那么您将获得<name>DEV</name>。输出类似于name> DEV。您只需要使用REGEX。