捕获正则表达式中除最后一个块之外的所有块

Capture all but last block in regex

我正在尝试从 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: ''

但不一定如此。

我本可以用负面的前瞻性来做到这一点 (?!...),但似乎 Go 不支持它。

有什么方法可以做到这一点?

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

它向 * 运算符添加了一个 "the shortest as possible"。

配置更改自:

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

至:

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