StringUtils替换两个模式之间的文本



嗨,我发现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组结束

相关内容

  • 没有找到相关文章

最新更新