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

标签 java xml regex

我想从消息中剥离 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/

相关文章:

c++ - 电话号码的QRegularExpression

c# - C# 中的正则表达式如何仅替换捕获组而不替换非捕获组

regex - 如何计算 Perl 中字符串开头的空格数?

java - 在 spring jpa 中执行 Hibernate.initialize() 时出现并发修改异常

python - 如何使用 python 忽略许多 XML 文件中的标签

java - 如何替换 --add-modules java.xml.ws

android - string.xml 中的表情符号 👍 使应用程序崩溃

java - 把我所有的 bean 放在不同的文件中

java - 来自空数组单元的 NullPointerException

java - 从 Java 调用 PHP 时的 Json 格式问题