【问题标题】:Use of ?> in Logstash Grok patterns在 Logstash Grok 模式中使用 ?>
【发布时间】:2015-06-05 14:25:08
【问题描述】:

一些标准的Logstash Grok patterns 使用?> 语法,这是我在正则表达式中从未见过的,而且似乎不是标准语法。

UNIXPATH 示例:

(?>/(?>[\w_%!$@:.,-]+|\\.)*)+

?> 的用途是什么意思?这是某种奇怪的前瞻吗?

【问题讨论】:

  • 我找不到与(?>\/[\w_%!$@:.,-]*)+不同的案例
  • 好点...不过我没有写这个,它来自 Grok 文档。

标签: regex logstash logstash-grok


【解决方案1】:

它是 .NET、PCRE 和许多其他正则表达式引擎的标准。但是,在 JavaScript 中不可用。

来自SO answer

原子组(和possessive modifier)有助于避免 catastrophic backtracking - 可被恶意用户利用 通过吞噬服务器的内存来触发拒绝服务攻击。

When are Atomic Groups Important?

当一系列字符仅作为一个块有意义时,使用 atomic group 可以防止不必要的回溯。这是在探索 所有格量词部分。在这种情况下,原子 量词可能有用,但不一定是关键任务。

另一方面,在某些情况下,原子量词可以 从灾难中拯救你的模式。它们特别有用:

✽ 为了避免Lazy Trap带有包含惰性的模式 标记可以吃定界符的量词
✽ 避免某些形式 的Explosive Quantifier Trap

【讨论】:

  • 顺便说一句,您展示的正则表达式也适用于非捕获组,请尝试在regex101.com 上将?> 替换为?:
【解决方案2】:

这是atomic group

原子组是一个组,当正则表达式引擎从中退出时,会自动丢弃组内任何标记记住的所有回溯位置

我看不出在您的情况下使用它的任何动机,除了使正则表达式更快(假设不可能简单地为外部的字符串锚点开头,并在字符范围后删除 +可能是内部解决方案的更好解决方案。

【讨论】:

  • 我假设 ?: 和 ?> 都没有递归地应用于嵌套组?否则我提到的标准 UNIXPATH 过滤器没有理由使用 ?> 两次...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2023-01-13
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多