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

正确使用反向引用和捕获组的Java正则表达式是什么,java,xml,regex,Java,Xml,Regex,我想从消息中剥离一个SOAP信封,以获取正文中的XML 我尝试了以下几点: String strippedOfEnvelopedHeader = msg.replaceAll("(?s)(?i)<(.*):Envelope.*<\1:Body>", ""); stringstrippedofenveledheader=msg.replaceAll(“(?s)(?i)”尝试两个反斜杠 "(?si)<(.*):Envelope.*<\\1:Body>" (?s

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

我尝试了以下几点:

String strippedOfEnvelopedHeader = msg.replaceAll("(?s)(?i)<(.*):Envelope.*<\1:Body>", "");
stringstrippedofenveledheader=msg.replaceAll(“(?s)(?i)”尝试两个反斜杠

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

(?si)作为一个方面,为什么不试着去掉整个soap消息包装器呢

String strippedof enveloped=msg.replace(“^(?six)<(*):信封。*(....*$”,“\\2”);
尝试以下操作:

String strippedOfEnvelopedHeader = msg.replaceAll("(?s)<(\\w+):Envelope[^<>]*>.*?<\\1:Body>", "");

在这个正则表达式中,第二个
*?
是合适的,如果你想删除标记,而不管标记里面是什么。

argh正则表达式来解析标记…我不知道soap,但它看起来像是xml本身?如果是这样,使用xml解析器。是的。我讨厌使用正则表达式。但是我一直在寻找一种方法来解决遗留jar依赖性的混乱使用Axis或JAX-WS阻止的。我让JAXB为body工作,所以这是我黑客的极限。[加上代码将在9个月内被替换]我使用org.w3c.dom.Document找到了一种“更安全”的方法。JAXB解组器可以获取一个dom节点对象,所以我只需使用dom获取Body元素的内容,然后将该节点传递给解组器。当然,这需要20多行代码、一堆额外的导入和一个try-catch,regex是一行代码。OP使用的是Java,而不是Java在java中引用的文字总是创建一个字符,比如C和C++。呵呵。我喜欢这个解决方案,在一条语句中完成所有操作,但我的问题是完全忘记了\1在Java中进行转义。在Java中正确的替换应该是$2而不是\\2。即msg.replaceAll((?si)@graney,在Perl中,我会在替换端使用$2。\\n在替换端使用$2是sed怪胎的特例。我有时甚至看到\\2在PCRE实现中也会使用。我认为Java是向后的。对不起。@snl:噢,Java是向后的,只是不是以你的思维方式。任何让你对多个级别的eva感到困惑的东西Java正则表达式的编程方式与尝试在
csh
中编程一样糟糕。试试Groovy、Perl、Ruby或其他任何东西。
String strippedOfEnvelopedHeader = msg.replaceAll("(?s)<(\\w+):Envelope[^<>]*>.*?<\\1:Body>", "");
String strippedOfEnvelopedHeader = msg.replaceAll("(?s)<(\\w+):Envelope[^<>]*>.*?<\\1:Body>\\s*(.*?)\\s*</\\1:Body>\\s*</\\1:Envelope>", "$2");