【问题标题】:Regex - Replace text between tags with new line characters正则表达式 - 用换行符替换标签之间的文本
【发布时间】:2017-11-07 04:26:22
【问题描述】:

我已经从 soaupui 请求中提取了请求文本,我正在尝试用新的标头替换所有内容。我尝试了几种不同的表达方式,但我认为匹配有问题,因为文本包含换行符。

下面是我尝试过的最新的一个

strRequest3 = strRequest3.replaceAll("<soapenv:Envelope(.*?
\\R)<soapenv:Header/>","<soap:Envelope " + strNewHeader + "</soap:Header>");
log.info strRequest3

下面是我尝试插入新的第一行和标题的示例 XML

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:urn="urn:dhs-gov-au:ccs:pms:sessionreport">
<soapenv:Header/>
<soapenv:Body>

任何关于我可以尝试实现上述正则表达式的想法将不胜感激

谢谢

【问题讨论】:

  • 不要使用正则表达式处理 XML(或 HTML)。只是...不要。
  • 我尝试在第一个实例中使用 XMLParser 和 XMLSlurper,但并没有走得太远。我可以从标签中提取文本,但我需要全部、标签、值、命名空间等,所以这样做似乎更容易。接受改进建议
  • @user3803807,什么是输入和预期的 xml?顺便问一下,它和你之前已经解决的question 有什么关系吗?

标签: java regex groovy


【解决方案1】:

如果您希望 .* 匹配换行符,则必须使用 s 标志(dotall)作为正则表达式。

在 Java 中,您可以通过在正则表达式前面添加 (?s) 来设置此标志。

String str = "<soapenv:Envelope>123123\n" +
            "123123\n" +
            "1231422343\n<soapenv:Header/>";
String replacement = "new";

System.out.println(str.replaceAll("(?s)<soapenv:Envelope>(.*)<soapenv:Header/>",
            "<soapenv:Envelope>" + replacement + "<soapenv:Header/>"));

【讨论】:

  • 谢谢,我试过了,现在得到一个错误“命名捕获组的名称长度为 0。我还需要包含其他内容来指定组吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
相关资源
最近更新 更多