【问题标题】:Need information on Grok patterns that use non capturing group (?: )需要有关使用非捕获组 (?:) 的 Grok 模式的信息
【发布时间】:2016-07-08 16:34:51
【问题描述】:

我了解使用捕获组和非捕获组编写正则表达式的概念。

例如:

a(b|c) 将匹配并捕获 abac

a(?:b|c) 将匹配 abac 但捕获 a

但是,当我创建一个新的自定义 grok 模式时它有什么用,以及使用非捕获组意味着什么。

查看一些现有的 grok 模式,如下面的 HOUR:

HOUR (?:2[0123]|[01]?[0-9])

在这里,我们也可以使用(2[0123]|[01]?[0-9]) 匹配小时格式。 是什么让 grok 模式在这里使用非捕获表达式?基于什么参数我应该决定使用这个(?:subex)

【问题讨论】:

  • 我不知道您使用的是什么语言,但我认为这是完全错误的。 a(b|c) 通常会捕获bc(取决于模式是否匹配abac),而a(?:b|c) 根本不会捕获任何内容。区别在于性能之一;为什么在你不需要做的时候捕捉一些东西?
  • Re "这里我们也可以使用(2[0123]|[01]?[0-9]) 匹配小时格式",这并不奇怪;捕获不会改变模式匹配的内容。

标签: regex logstash-grok


【解决方案1】:

Grok 中带或不带捕获组的模式之间的区别在于是否需要创建字段。

(?:2[0123]|[01]?[0-9]) 模式包含一个非捕获组,仅用于分组 子模式序列。 (2[0123]|[01]?[0-9]) 正则表达式包含一个编号的捕获组,它匹配并捕获该值(=存储在一些额外的缓冲区中,ID 等于模式中捕获组的顺序)。请注意,还有命名的捕获组,例如(?<field>2[0123]|[01]?[0-9]),它将捕获的值分配给命名的组。

named_captures_only 参数设置为falsea(b|c) 正则表达式将匹配abac 并将bc 分配给单独的字段。当您使用 非捕获组 a(?:b|c) 时,将永远不会创建任何字段,只会匹配此文本。

由于named_captures_only parameter 默认值为True,因此在 Grok 模式中删除了编号捕获组或非捕获组之间的差异。因此,默认情况下,只能使用命名捕获(如a(?<myfield>b|c))来创建字段。

我认为优先考虑常见 Grok 模式中的非捕获组,以便不依赖于 named_captures_only 参数设置。

【讨论】:

  • Grok 中带或不带捕获组的模式之间的区别在于您是否需要创建字段。这有助于回答我的问题,现在我可以在比赛中实现同样的效果。
  • 我也想知道named_captures_only的意义。如果我定义了一组 grok 模式,它只会匹配模式集中定义的那些?这就是它的意思?。
  • 这意味着只进行命名的捕获,编号的将被忽略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2014-11-04
  • 1970-01-01
相关资源
最近更新 更多