【问题标题】:Capture all but last block in regex在正则表达式中捕获除最后一个块之外的所有块
【发布时间】:2025-12-26 10:15:11
【问题描述】:

我正在尝试从 Prometheus 重新标记配置(基于正则表达式)中的变量中提取值。所有值都匹配模式:

[a-zA-Z]+(-[a-zA-Z]+)*

我想获取该值并在 -admin 部分存在时删除它。

例子:

foo-bar-baz     ->  foo-bar-baz
foo             ->  foo
qux-quuz-admin  ->  qux-quuz

如果所有值都有-admin,我会这样写:

- source_labels: ['__meta_consul_service']
  regex: '(.*)-admin'
  target_label: 'job'
  replacement: '$1'

但不一定如此。

我本可以通过消极的前瞻性 (?!...) 做到这一点,但似乎 Go 不支持这一点。

这样做的方法是什么?

【问题讨论】:

  • 一点也不。我不知道你为什么会有这种印象。

标签: regex-group prometheus


【解决方案1】:

* 是一个贪婪的运算符:它尽可能匹配。有一个非贪婪运算符:*?

它为* 运算符添加了一个“尽可能短的”。

配置更改自:

- source_labels: ['__meta_consul_service']
  regex: '(.*)-admin'
  target_label: 'job'
  replacement: '$1'

到:

- source_labels: ['__meta_consul_service']
  regex: '(.*?)(-admin)?'
  target_label: 'job'
  replacement: '$1'

【讨论】:

    最近更新 更多