正则表达式跳过类似的结果

时间:2017-10-06 19:25:17

标签: regex

我一直试图想出办法来解决我在PCAP文件中搜索的问题。我正在寻找标题" Content-Type:。*"在HTTP OK响应之后。但是,在这样的例子中:

HTTP/1.1 200 OK
date:
asdf
X-Content-Type: aadsf
Content-Type: application/json
more: stuff

HTTP/1.1 200 OK
date:
asdf
X-Content-Type: aadsf
Content-Type: application/json
more: stuff

我当前的正则表达式"HTTP\/1.1 200 OK[\s\S]*?Content-Type:.*"会停止X-Content-Type: aadsf处的捕获组。我的目的是使用正则表达式捕获组转到Content-Type: application/json

任何可以给我一些指示的正则表达式向导?

3 个答案:

答案 0 :(得分:2)

您可能使用的没有外观的PCRE正则表达式是

(?m)^HTTP.*(?:\R.+)*?\RContent-Type:\s*\K.+

请参阅regex demo。如果您想提高效率,replace the first .+ with .++。可以很容易地重写它以便与捕获组一起使用并说出(CR)?LF结束:

^HTTP.*(?:\r?\n.+)*?\r?\nContent-Type:\s*(.+)

请注意,m多线修改器可能仍然需要使^匹配线的起点。

<强>详情:

  • ^ - 开始行
  • HTTP - 子字符串
  • .* - 其余部分
  • (?:\R.+)*? - 任意0+,尽可能少的换行符序列(\R\r?\n)后跟一个或多个换行符而不是换行符
  • \R - 换行符
  • Content-Type: - 文字子字符串
  • \s* - 0+ whitespaces
  • \K - 匹配重置运算符,丢弃与当前匹配值匹配的所有文本
  • .+ - 换行符以外的一个或多个字符。

答案 1 :(得分:1)

您可以使用

^HTTP             # match HTTP at the start of the line
(?s:(?!^$).)+?    # anything lazily, do not overrun an empty newline
^Content-Type:\s* # Content-Type: at the start of a line
(?P<type>.+)      # capture the type

请参阅a demo on regex101.com

答案 2 :(得分:0)

这是正则表达式^((?:X-)?Content-Type):(.*)$,它捕获两种内容类型。或者只是在\n之前添加Content-Type(换行符),如果您希望在一个额外的内容类型之后停止它。