需要有关使用非捕获组 (?:) 的 Grok 模式的信息

Need information on Grok patterns that use non capturing group (?: )

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

例如:

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)

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 参数设置。