0

我正在使用 Grafana 和 Prometheus 创建一些图表,但我认为这基本上是一个正则表达式(RE2?)问题。我正在动态创建一个元素列表并填充一个变量(查询label_values(source)“源”包含可能结果列表的位置)。查询返回如下列表:

udr_foo
udr_owls
dns-baz1
dns-baz399
rpz_c_1.donotuse
rpz_c_1.memosis
rpz_c_1.argylesocks
rpz_c_1.argylesocks3
rpz_c_1.argylesocks_http2

我无法修改数据库中的数据;我必须用正则表达式修剪它。目前,我有这个 RE2 正则表达式,我把它放在一起,我申请到列表中做一些排除:

/^(?!dns|udr|rpzlog_c_1.donotuse).*/

这给了我一个部分有用的结果,因为它排除了我不想要的结果:

rpz_c_1.memosis
rpz_c_1.argylesocks
rpz_c_1.argylesocks3
rpz_c_1.argylesocks_http2

问题:我将如何修改该正则表达式,以便通过剥离前导“rpz_c_1”为我提供更简洁的结果集。字符串组件?由于这是嵌入在 Grafana 工具中的,因此我无法将多个正则表达式实例与 shell 一起“管道” - 我只有一个正则表达式机会来修改结果。这是我希望返回的一组结果:

memosis
argylesocks
argylesocks3
argylesocks_http2

我的正则表达式可能很糟糕。一种更简洁的看待方式可能是:

  • 返回所有包含“rpz_c_1”的结果。作为字符串的开头
  • 除了包含字符串“donotuse”的任何内容
  • 然后剥离“rpz_c_1”。从每个字符串的开头
4

1 回答 1

3

您可以通过rpz_c_1.在匹配点之后,断言右边的内容不是donotuse

如果是这种情况,请使用匹配 1+ 个非空白字符的捕获组,使用\S+as using.*将匹配除换行符以外的任何字符 0+ 次。

^rpz_c_1\.(?!donotuse)(\S+)

正则表达式演示

于 2020-05-15T20:08:13.057 回答