0

我的字符串中通常有 xml 标签。但现在我有一个包含一些 html 标记的标签。一个字符串可以包含,<hg>This is text</hg><html><![CDATA[<table>this is table</table>]]</html>。我只想用空字符串替换外部标签。因此,在第一种情况下,<hg></hg>将被空字符串替换,而在第二种情况下,将被空字符串<html></html>替换。我正在使用外部 api 并且只能为此使用正则表达式?我试过了

String retVal = original.replace("`<.*?>.*</.*>`",""); but it didn't work.

编辑:

我希望结果产生为<!CDATA[[<table>winter</table>]]> String original = "<html><![CDATA[[<table>winter</table>]]></html>" String retval = original.replaceAll("<([^>]*)>(?:[^<]|<!\[CDATA\[.*?]]>)*</\\1>", "");

4

5 回答 5

1

假设没有相同类型的嵌套标签,您可以使用

String retVal = original.replaceAll(
    "(?s)<(\\w+)(?: [^>]*)?>(\\s*<!\\[CDATA\\[.*?\\]\\]>\\s*|.*?)</\\1>", "$2"
);

(?s)打开单行模式,因此.也匹配换行符。
\\1是匹配的任何内容(\\w+),即它是标签名称。
$2是标签内的内容。

于 2013-04-12T16:28:02.753 回答
0

尝试:

String retVal = original.replace("<([^>]*)>([^<]|<!\\[CDATA\\[.*?]]>)*</\\1>","$2");

尽管如此,如果您的标签具有属性,它会失败(尽管可以更改它以适应)。

编辑:
编辑,因为我没有看到你的例子中的缺陷。您在 CDATA 末尾缺少一个“>”。

于 2013-04-12T14:15:34.293 回答
0

这个任务对于正则表达式来说似乎太复杂了,我只能提供一个算法解决方案

    String s = "<hg>This is text</hg> or <html><![CDATA[<table>this is table</table>]]</html>.";
    StringBuilder sb = new StringBuilder();
    for(int i = 0; i != -1;){
        i = s.indexOf("<![CDATA[", i);
        if (i != -1) {
            sb.append(s.substring(0, i).replaceAll("<.*?>", ""));
            int j = s.indexOf("]]");
            sb.append(s.substring(i + 9, j));
            s = s.substring(j + 2);
            i = 0;
        } 
    }
    sb.append(s.replaceAll("<.*?>", ""));
    System.out.println(sb);

输出

This is text or <table>this is table</table>.
于 2013-04-12T14:43:57.450 回答
0

以下示例是在 C# 中。为 Java 修改它。

string result = Regex.Replace(input, @"<(\w+)>(.*)</\1>", "$2");
于 2013-04-12T17:50:55.003 回答
-1

“(?(?!])”

如果我理解你并使用你的示例中的 replaceAll 方法,这应该符合你想要的,它只匹配并且

于 2013-04-12T19:40:33.867 回答