我有这个字符串grafana-stack_alloy
,并且需要第一个下划线后的所有内容
alloy
。
我需要以组的形式得到结果$1
。试过这个,但失败了(?:)?([^_]+)*$
。
谁能帮我解决这个问题?
我正在测试这个:
rule {
action = "replace"
source_labels = [
"__meta_docker_container_label_com_docker_swarm_service_name",
]
regex = "^(?:;*)?([^;]+).*$" work but wrong
//regex = "[^_]+.$" ----> not work
//regex = "([^_]+)$" ----> not work
replacement = argument.namespace.value + "/$1"
target_label = "job"
}
它是关于带有 relabel-regex 的 Grafana 代理: Grafana prometheus.relabel使用Google 的 RE2作为其正则表达式引擎。
提前致谢
至于Grafana 使用 Golang 正则表达式风格,您需要将正则表达式修改为:
查看在线演示说明
官方文档也提到了 Golang:
这些将获得最后一个下划线后的所有内容。
或者
如果您想要第一个下划线后的所有内容:
或者,如果您不想要前导下划线,则将第一个更改
*
为 a 。+
如果你还想消除双下划线中的第二个下划线,但获得其后的所有内容,请尝试
如果你想要更具体的匹配,也许你想要
如果这些都不能满足您的要求,那么您将需要提供比所提供的字符串更多的周围环境。
因为“替换”是:
这意味着正则表达式匹配的内容将被替换为该内容。
在 中
grafana-stack_alloy
,您的([^_]+)$
正则表达式将正确匹配alloy
之后的部分_
并将其捕获$1
到 中,但由于整个正则表达式只匹配 ,因此在替换之后,您将得到:如果您希望替换后的结果仅为
<argument.namespace.value>/alloy
,那么您需要正则表达式来匹配整个输入并捕获之后的部分_
。由于 RE2 支持 perl 的
*?
非贪婪重复运算符,因此可以这样:锚点(
^
,$
)甚至不是必需的,因为只要该正则表达式至少包含一个锚点,它就保证与整个输入匹配_
(如果没有 ,则无论有没有锚点都根本不匹配_
)。