我想从一条消息中剥离一个soap信封,以获取正文中的xml。
我尝试了以下几点:

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

我认为这会从类似于消息的消息中挑出soap信封,特别是头;
<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>
<env:Header xmlns:env='http://schemas.xmlsoap.org/soap/envelope/' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'/>
<soapenv:Body>
<myXML> stuff is here</myXML>
</soapenv:Body>
</soapenv:Envelope>

会导致;
<myXML> stuff is here</myXML>
</soapenv:Body>
</soapenv:Envelope>

但是,group back引用似乎不起作用。
如果我同时替换捕获组和后引用,则替换工作正常;
String strippedOfEnvelopeHeader = msg.replaceAll("(?i)(?s)<soapenv:Envelope.*<soapenv:Body>", "");

我想我能猜出问题所在,抓捕组贪婪地抓取了整个信息,从而导致匹配失败。
但我无法找到解决办法。
有什么想法吗?

最佳答案

尝试两次反斜杠

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

您需要2,因为\1本身已经是Java的一个特殊的转义序列。因此,在输入regex引擎之前,它将被解码为字符u+0001。你需要再加一个反斜杠来保护它。
(下面是常见的“不要用regex解析xml”警告…)

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

10-08 20:31