嗨,我发现apache操作符真的很有用
StringUtils.substringBetween(fileContent, "<![CDATA[", "]]>")
提取
中的信息<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<envelope>
<xxxx>
<yyyy>
<![CDATA[
<?xml version="1.0" encoding="UTF-8" ?>
<Document >
<eee>
<tt>
<ss>zzzzzzz</ss>
<aa>2021-09-09T10:39:29.850Z</aa>
<aaaa>
<Cd>cccc</Cd>
</aaaa>
<dd>ssss</dd>
<ff></ff>
</tt>
</eee>
</Document>
]]>
</yyyy>
</xxxx>
</envelope>
但现在我要找的是另一个操作符或正则表达式允许我替换动态xml
![CDATA["old_xml"]]
被另一个xml
![CDATA["new_xml"]]
有什么好主意吗?
致意。
可以使用String#replaceAll
方法代替StringUtils
:
fileContent = fileContent
.replaceAll("(?s)(<!\[CDATA\[).+?(]]>)", "$1foo$2");
解释:
(?s)
:启用DOTALL
模式,使.
可以匹配.+?
中的换行符(<!\[CDATA\[)
:匹配打开<![CDATA[
子字符串和捕获组#1.+?
:匹配0个或多个字符,包括换行(]]>)
:匹配关闭]]?
子字符串和捕获组#2$1foo$2
:用foo
替换两边都有捕获组1和2的反向引用
您可以使用正则表达式,(<![CDATA[).*?(]]>)
。
演示:
public class Main {
public static void main(String[] args) {
String xml = """
...
<data><![CDATA[a < b]]></data>
...
""";
String replacement = "foo";
xml = xml.replaceAll("(\<!\[CDATA\[).*?(\]\]>)", "$1" + replacement + "$2");
System.out.println(xml);
}
}
输出:
...
<data><![CDATA[foo]]></data>
...
正则表达式说明:
(
: group#1开始<![CDATA[
: String<![CDATA[
)
:第1组结束.*?
:任意字符任意次数(
:组#2开始]]>
: String]]>
)
:第2组结束