提取xml标记的正则表达式,包括可能具有CDATA标记的xml标记

时间:2013-04-12 13:51:03

标签: java regex

我的字符串中通常有xml标签。但是现在我有一个包含一些html标记的标签。字符串可以包含<hg>This is text</hg><html><![CDATA[<table>this is table</table>]]</html>。我只想用空字符串替换outertags。因此,在第一种情况下,<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>", "");

5 个答案:

答案 0 :(得分:1)

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

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

(?s)启用了单线模式,因此.也会匹配换行符 \\1(\\w+)匹配的任何内容,即它是标记名称 $2是代码中的内容。

答案 1 :(得分:0)

尝试:

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

但是,你的标签有属性,它会失败(可以改变它以适应)。

修改
编辑,因为我没有看到你的例子中的缺陷。你错过了一个“&gt;”在您的CDATA结束时。

答案 2 :(得分: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>.

答案 3 :(得分:0)

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

string result = Regex.Replace(input, @"<(\w+)>(.*)</\1>", "$2");

答案 4 :(得分:-1)

“(?(?])”

如果我理解你并使用replaceAll方法,这应该匹配你想要的 从你的例子中它只匹配和