我理解使用捕获和非捕获组编写正则表达式的概念。
例如:
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)
答案 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)
正则表达式将匹配ab
或ac
并指定b
或{ {1}}到一个单独的字段。当您使用非捕获组 c
时,将不会创建任何字段,只会匹配此文本。
由于named_captures_only
parameter默认值为a(?:b|c)
,因此在Grok模式中删除编号捕获或非捕获组之间的差异。因此,默认情况下,只能使用命名捕获(如True
)来创建字段。
我认为首选Grok模式中的非捕获组,以便不依赖于a(?<myfield>b|c)
参数设置。