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

标签 regex logstash-grok

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

前任:
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)正则表达式将匹配 abac并分配一个 bc到一个单独的字段。当您使用非捕获组时 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/

相关文章:

javascript - 使用 JavaScript 的正则表达式中的 ASterisk 或数字

regex - 如何将正则表达式匹配到字符串末尾?

regex - 具有此日志行的 Grok 模式

elasticsearch - Logstash到Kibana多行不适用于自定义消息

c++ mac os x regex (".*") 使用 regex_replace() 导致无限循环

javascript - JS 正则表达式,基本先行

css - 在 css 中使用正则表达式?

date - 如何 grok catalina 日志文件

elasticsearch - elasticsearch-使用logstash日期导入csv未解析为datetime类型

elastic-stack - Filebeat 给出 : object mapping for [error] tried to parse field [error] as object, 但找到了具体值