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

时间:2016-07-08 16:34:51

标签: regex logstash-grok

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

例如:

a(b|c)会匹配并捕获 ab ac

a(?:b|c)会匹配 ab ac ,但会捕获 a

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

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

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

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

1 个答案:

答案 0 :(得分:5)

具有捕获组的模式与Grok中没有的模式之间的区别在于您是否需要创建字段。

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

named_captures_only参数设置为 false a(b|c)正则表达式将匹配abac并指定b或{ {1}}到一个单独的字段。当您使用非捕获组 c时,将不会创建任何字段,只会匹配此文本。

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

我认为首选Grok模式中的非捕获组,以便不依赖于a(?<myfield>b|c)参数设置。