使用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")
答案 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)