我理解使用捕获和非捕获组编写正则表达式的概念。
前任:a(b|c)
将匹配并捕获 ab 和 交流 a(?:b|c)
会匹配 ab 和 交流 但捕获
但是当我创建一个新的自定义 grok 模式时它有什么用,以及使用非捕获组意味着什么。
在 HOUR 中查看一些现有的 grok 模式,如下所示:
HOUR (?:2[0123]|[01]?[0-9])
这里我们可以使用
(2[0123]|[01]?[0-9])
匹配小时格式以及。是什么让 grok 模式在这里使用非捕获表达式?我应该根据什么参数决定使用这个
(?:subex)
最佳答案
Grok 中带捕获组与不带捕获组的模式的区别在于您是否需要创建字段。(?:2[0123]|[01]?[0-9])
模式包含一个非捕获组,仅用于对子模式序列进行分组。 (2[0123]|[01]?[0-9])
regex 包含一个编号的捕获组,它匹配并捕获值(= 存储在一些附加缓冲区中,其 ID 等于模式中捕获组的顺序)。请注意,还有命名的捕获组,例如 (?<field>2[0123]|[01]?[0-9])
将捕获的值分配给命名组。
与 named_captures_only
参数设置为 false,a(b|c)
正则表达式将匹配 ab
或 ac
并分配一个 b
或 c
到一个单独的字段。当您使用非捕获组时 a(?:b|c)
,不会创建任何字段,只会匹配此文本。
自 named_captures_only
parameter默认值为 True
、的区别编号 捕获或非捕获组在 Grok 模式中被删除。因此,默认情况下只能使用命名捕获(如 a(?<myfield>b|c)
)来创建字段。
我认为优先考虑常见 Grok 模式中的非捕获组,以便不依赖于 named_captures_only
参数设置。
关于regex - 需要有关使用非捕获组的 Grok 模式的信息 (? : ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38271605/