我想从消息中剥离 SOAP 信封以获取正文中的 XML。
我尝试了以下操作;
String strippedOfEnvelopedHeader = msg.replaceAll("(?s)(?i)<(.*):Envelope.*<\1:Body>", "");
我认为这会从类似的消息中指出 SOAP 信封,特别是 header ;
<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。您需要再添加一个反斜杠来保护它。
(通常的“不要使用正则表达式解析 XML”警告如下...)
关于java - 正确使用反向引用和捕获组的 Java 正则表达式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5058692/