gpt4 book ai didi

java - 什么是正确使用反向引用和捕获组的 Java 正则表达式

转载 作者:数据小太阳 更新时间:2023-10-29 02:59:10 27 4
gpt4 key购买 nike

我想从消息中剥离 SOAP 信封以获取正文中的 XML。

我尝试了以下;

String strippedOfEnvelopedHeader = msg.replaceAll("(?s)(?i)<(.*):Envelope.*<\1:Body>", "");

我认为这会从消息中去掉 SOAP 信封,特别是标题;


<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'><br/>
<env:Header xmlns:env='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'/><br/>
<soapenv:Body><br/>
<myXML> stuff is here</myXML><br/>
</soapenv:Body><br/>
</soapenv:Envelope>

结果应该是;


<myXML> stuff is here</myXML><br/>
</soapenv:Body><br/>
</soapenv:Envelope>

但是,组反向引用似乎不起作用。

如果我同时替换捕获组和反向引用,替换工作正常;

String strippedOfEnvelopeHeader = msg.replaceAll("(?i)(?s)<soapenv:Envelope.*<soapenv:Body>", "");

我想我能猜到问题所在,捕获组贪婪地捕获了整个消息,因此匹配失败。

但解决方案让我望而却步。

有什么想法吗?

最佳答案

尝试2个反斜杠

"(?si)<(.*):Envelope.*<\\1:Body>"

您需要 2 因为 \1 本身已经是 Java 的特殊转义序列。因此,在提供给正则表达式引擎之前,它将被解码为字符 U+0001。您需要再添加一个反斜杠来保护它。

(随后是通常的“不要使用 Regex 解析 XML”警告..​​.)

关于java - 什么是正确使用反向引用和捕获组的 Java 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5058692/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com