我的字符串中通常有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>", "");
答案 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方法,这应该匹配你想要的 从你的例子中它只匹配和