【问题标题】:Strip all data before a match在匹配之前删除所有数据
【发布时间】:2023-04-04 01:00:01
【问题描述】:

我有以下格式的数据。我需要去除出现在<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">

如何使用正则表达式做到这一点?

【问题讨论】:

  • 你在使用 Perl?只需遍历文件并丢弃所有行,直到找到以该模式开头的行。
  • @dan1111 数据存在于一个变量中,该变量是 webservice 的响应。所以我需要一个正则表达式或其他东西来删除 HTTP 部分
  • 这是一个 HTTP 响应流,通常正文不一定以 &lt;s:Envelope 开头。要获得正文,需要剥离 HTTP 标头。这可以通过s/\A(?:^HTTP.*?(?:^.+$)*^$)+//sm 实现。演示:ideone.com/LEPpkQ

标签: regex perl


【解决方案1】:

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

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

在这个正则表达式中:

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

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

【讨论】:

  • 复杂。我需要一些时间来掌握这个。不过它正在工作。
猜你喜欢
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2022-01-07
  • 1970-01-01
  • 2018-09-01
相关资源
最近更新 更多