【问题标题】:Regex match anything that is not sub-pattern正则表达式匹配任何不是子模式的东西
【发布时间】:2012-11-12 07:23:51
【问题描述】:

我的 HTTP 标头中有 cookie,如下所示:

Set-Cookie: frontend=ovsu0p8khivgvp29samlago1q0; adminhtml=6df3s767g199d7mmk49dgni4t7; external_no_cache=1; ZDEDebuggerPresent=php,phtml,php3

我需要提取前端之后的 26 个字符的字符串(例如ovsu0p8khivgvp29samlago1q0)。以下正则表达式与我匹配:

(?<=frontend=)(.*)(?=;)

但是,我正在使用 Varnish Cache,并且只能使用正则表达式替换。因此,要提取该 cookie 值(26 个字符 frontend 字符串),我需要匹配与该模式不匹配的所有字符(因此我可以将它们替换为 '')。

我已经在 Google 上进行了相当多的搜索,但到目前为止还是一片空白。我已经尝试了以下

  • 匹配与我想要的模式不匹配的字符:[^((?&lt;=frontend=)[A-Za-z0-9]{26}(?=;))] 匹配随机字符,包括我想要保留的字符

如果有人能指出我正确的方向,或者指出我可能出错的地方,我将不胜感激。

【问题讨论】:

  • 我猜frontend 可能出现在 cookie 字符串中的任何位置?
  • @m.buettner 是的,没错。

标签: regex varnish varnish-vcl


【解决方案1】:

使用正则表达式

^Set-Cookie:.*?\bfrontend=([^;]*)

并且“前端之后的26个字符串”将在1组中(通常在替换字符串中称为$1

【讨论】:

  • @m.buettner - 感谢您优化我的解决方案。
  • 这让我得到了我所追求的 26 个字符的值,但我仍然坚持如何选择与该模式不匹配的任何内容
  • @james :: 然后使用更多组:^(Set-Cookie:\s)(.*?)(\bfrontend=)([^;]*)(.*)$
  • 我需要选择与该模式不匹配的所有内容,因为我只能替换。 lkarsten 向我指出了一个模块,使我能够选择我需要的东西
【解决方案2】:

您可以控制替换字符串吗?如果是这样,您可以使用 Ωmega 的答案,并在替换字符串中使用 $1frontend 值写回。

否则,你可以使用这个:

^Set-Cookie:.*(?!frontend=)|(?<=frontend=.{26}).*$

这将匹配从字符串开头的所有内容,直到遇到frontend=。或者它将匹配所有具有frontend= 的内容,其左侧正好有 26 个字符,直到字符串的末尾。如果这 26 个字符是可变长度的,那么它会变得更加复杂,因为只有 .NET 支持可变长度的后视。

关于你的最后一个问题。让我们看看你的正则表达式:

[^((?<=frontend=)[A-Za-z0-9]{26}(?=;))]

嗯,首先你试图用否定字符类[^...] 来包围你的模式,实际上并不能像这样工作。它仍然是一个字符类,因此它只匹配不在该类中的单个字符。但它变得更加复杂(我想知道为什么它完全匹配)。所以首先字符类应该由 first ] 关闭。这个字符类匹配任何不是(?&lt;=)、字母或数字的字符。然后 {26} 被应用到那个,所以我们试图找到其中的 26 个字符。然后是(?=;),它断言这26 个字符后面跟着;。现在是什么不应该工作。关闭 ) 实际上应该抛出错误。最后的] 将被解释为文字]

有一些正则表达式允许嵌套字符类(Java 可以)。在这种情况下,您只需拥有一个等同于[^a-zA-Z0-9(){}?&lt;=;] 的字符类。但据我所知,Varnish 使用 PCRE,而在 PCRE 中,您的正则表达式根本不应该编译。

【讨论】:

  • 感谢您解释正则表达式 :-)
【解决方案3】:

Set-Cookie 响应头在 Varnish 中有点神奇,因为后端倾向于发送多个同名的头。这是 RFC 禁止的,但实际上是这样做的。

如果您使用 Varnish 3.0,您可以使用 Header VMOD,它可以解析响应并提取您需要的内容:

https://github.com/varnish/libvmod-header

【讨论】:

  • 这正是我想要的。谢谢
猜你喜欢
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 2021-08-10
  • 2011-10-28
相关资源
最近更新 更多