11

我有以下 Java 代码:

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

这会变成这样的字符串:

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

进入:

How now  cow.

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

How now brown cow.

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

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

进入:

How now brown cow.

我试过这个:

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

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

4

6 回答 6

39
"How now <fizz>brown</fizz> cow.".replaceAll("<[^>]+>", "")
于 2013-04-02T16:18:15.193 回答
7

你快到了;)

试试这个:

str = str.replaceAll("<.*?>", "")
于 2013-04-02T16:18:42.110 回答
3

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

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

您的第二次尝试<.*?></.*?>|<.*?/>不起作用的原因是因为它将从标签的开头选择到 tag之后的第一个关闭标签。这有点拗口,但你可以更好地理解这个例子中发生了什么。

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

于 2013-04-02T18:00:01.683 回答
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.
于 2013-04-02T16:32:42.363 回答
1

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

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

正则表达式:

to_replace='<\w*>|<\/\w*>',value="" 
于 2018-06-29T14:33:51.663 回答
0

如果你想解析 XML 日志文件,那么你可以使用正则表达式 {java} <[^<]+<,.so 你得到<name>DEV</name>. 输出如名称> DEV。你只需要玩 REGEX。

于 2019-01-23T12:32:14.550 回答