在匹配前删除所有数据

时间:2017-05-05 10:07:44

标签: regex perl

我的数据格式如下。我需要删除<s:Envelope之前显示的所有数据。

HTTP/1.1 100 Continue

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Fri, 05 May 2017 09:52:02 GMT
Content-Length: 338962

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body><RetrieveStoredRoutesResponse xmlns="http://schema.website.com">

如何使用正则表达式执行此操作?

1 个答案:

答案 0 :(得分:1)

这看起来像一个HTTP响应流,您只需要HTTP响应体。一般来说,正文可能不一定以<s:Envelope开头。要获取正文,您需要剥离HTTP标头。标题是一系列非空行,后跟一个空行,第一行以HTTP开头。用于删除标头的Perl正则表达式替换运算符是

s/\A(?:^HTTP.*?(?:^.+$)*^$)+//sm;

在这个正则表达式中:

  • \A匹配整个输入的开头(请注意,此处使用^来匹配自使用/m以来新行的开头)
  • (?: - 外部非捕获组的开始。该组匹配单个HTTP标头块
    • ^ - 开始行
    • HTTP - HTTP字面意思
    • .*? - 任何非贪婪方式的文字(由于以下^而有效地延续到行尾)
    • (?: - 内部非捕获组的开始。该组匹配单个非空行
      • ^ - 开始行
      • .+ - 一个或多个字符(即非空行)
      • $ - 行尾
    • ) - 内部非捕获组的结束。
    • * - 重复该组(非空行)零次或多次
  • ) - 外部非捕获组的结束。
  • + - 重复一次(HTTP标头块)一次或多次

Perl演示:https://ideone.com/LEPpkQ