用变量名空格替换xml元素之间的字符串

时间:2014-05-21 15:31:39

标签: java regex

使用Java,String和replaceAll我必须替换可能带有不同名称空间的元素值:

<tns:p>to be replaced</tns:p> 
<sss:p>to be replaced</sss:p> 

<tns:p>replaced</tns:p> 
<sss:p>replaced</sss:p>

请问,请帮忙找到替换的正则表达式?

P.S。元素在给定字符串中可能出现多次:

<tns:p>to be replaced</tns:p>
<tns:w>not to be replaced</tns:w>
<tns:p>to be replaced</tns:p>

我在元素前面有变量名空格的问题。 没有他们,我会这样做:

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

2 个答案:

答案 0 :(得分:1)

问题是,后视广告不能有可变的长度,但是如果您的输入结构良好(标签是用匹配的标签关闭的),那么要替换的文本不是CDATA元素它本身包含结束标记(似乎不太可能),这将起作用:

str = str.replaceAll("(?<=[:<]p>)[^<]*(?=</(\\w+:)?p>)", "replacement");

这个正则表达式可以替换是否存在命名空间。


这是一些测试代码:

String str = "<p>to be replaced</p><tns:p>to be replaced</tns:p><tns:w>not to be replaced</tns:w><tns:p>to be replaced</tns:p>";
str = str.replaceAll("(?<=[:<]p>)[^<]*(?=</(\\w+:)?p>)", "replacement");
System.out.println(str);

输出:

替换

替换不被替换替换

如果您输入格式良好且简单,即结束标记命名空间可能相同,您可以通过捕获命名空间,使用背面来完成 - 在结束标记中断言它是相同的,并将其放回替代标记中:

str = str.replaceAll("(<(\\w+:)?p>)[^<]*(?=</(\\2)p>)", "$1replacement");

命名空间仍然是可选的,但现在结束标记中的命名空间必须与开始标记的命名空间匹配。

答案 1 :(得分:0)

java正则表达式中的Lookbehinds不支持代理运算符,所以不幸的是,只有一个String#replaceAll(String, String)