【问题标题】:StringUtils replace text in between two patternsStringUtils 替换两个模式之间的文本
【发布时间】:2021-10-29 22:22:05
【问题描述】:

您好,我发现 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"]]

知道如何实现这一点吗?

问候。

【问题讨论】:

  • 这很好用......直到你有一个包含两个 CDATA 部分的 XML,一个接一个。正如过去十年在本网站上great and passionate length 所讨论的那样,正则表达式绝对是用于处理任意 XML、HTML、JSON 等的错误工具。您需要一个真正的解析器来处理您正在处理的任何风格。 “有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题。 -- Jamie Zawinski
  • 100% 同意,但我只从 CDATA 中提取“文本”,一旦我使用 DOM 解析器提取文本
  • 如果您坚持使用正则表达式,请准备好在您最不期望的时候它会崩溃。也准备被任何维护它的人诅咒。
  • 这个想法终于被否决了XD

标签: java regex apache-utils


【解决方案1】:

你可以使用String#replaceAll方法代替StringUtils

fileContent = fileContent
  .replaceAll("(?s)(<!\\[CDATA\\[).+?(]]>)", "$1foo$2");

说明:

  • (?s):启用DOTALL 模式,以便. 也可以匹配.+? 中的换行符
  • (&lt;!\\[CDATA\\[):匹配打开 &lt;![CDATA[ 子字符串并在组 #1 中捕获
  • .+?:匹配 0 个或多个任意字符,包括换行符
  • (]]&gt;):匹配结束 ]]? 子字符串并在组 #2 中捕获
  • $1foo$2:替换为foo,两边都是捕获组1和2的反向引用

【讨论】:

  • @paul:答案已更新。如果您提前提供了这个用例数据,我们将首先得到这个答案。
  • .replaceAll("(?s)(&lt;!\\[CDATA\\[).+?(]]&gt;)", "$1foo$2") -- 什么是(?s)?你的意思是(?:\\s)
  • @JimGarrison: (?s) 用于启用DOTALL 模式,以便. 也可以匹配.+? 中的换行符
【解决方案2】:

您可以使用regex(\&lt;!\[CDATA\[).*?(\]\]&gt;)

演示:

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>
...

正则表达式的解释

  • ( : 组#1 的开始
    • \&lt;!\[CDATA\[:字符串&lt;![CDATA[
  • ) : 组#1 结束
  • .*? : 任意字符任意次数
  • ( : 组#2 的开始
    • \]\]&gt;:字符串]]&gt;
  • ) : 组#2 结束

【讨论】:

    猜你喜欢
    • 2014-10-24
    • 1970-01-01
    • 2021-07-02
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2016-08-16
    相关资源
    最近更新 更多