我使用谷歌re2正则表达式来查询Grafana仪表板上的Prometheus。尝试通过以下3种类型的可能输入字符串从键中获取值
1. object{one="ab-vwxc",two="value1",key="abcd-eest-ed-xyz-bnn",four="obsoleteValues"}
2. object{one="ab-vwxc",two="value1",key="abcd-eest-xyz-bnn",four="obsoleteValues"}
3. object{one="ab-vwxc",two="value1",key="abcd-eest-xyz-bnn-ed",four="obsoleteValues"}
验证如下所列
- 应包含
abcd-
- 不应包含
-ed
不知怎么的,这个正则表达式
bkey="(abcd(?:-w+)*[^-][^e][^d]w)"
满足第一条件abcd-
但不能满足第二条件(否定-ed
(。
预期的输出将是来自第二个输入选项的abcd-eest-xyz-bnn
。如有任何帮助,我们将不胜感激。非常感谢。
如果我正确理解您的需求,以下模式应该可以工作:
bkey="(abcd(?:-e|-(?:[^eW]|e[^dW])w*)*)"
演示。
重要部分的细分:
(?: # Start a non-capturing group.
-e # Match '-e' literally.
| # Or the following...
- # Match '-' literally.
(?: # Start a second non-capturing group.
[^eW] # Match any word character except 'e'.
| # Or...
e[^dW] # Match 'e' followed by any word character except 'd'.
) # Close non-capturing group.
w* # Match zero or more additional word characters.
) # Close non-capturing group.
或者简单地说:
匹配连字符,后跟:
- 只有字母'e'或者
- 单词*不以'e'开头或者
- 一个以"e"开头、后面不跟"d"的单词
*A";单词";这里的意思是regex中定义的字符串
也许可以试试:
bkey="((?:ktm-(?:(?:e-|[^e]w*-|e[^d]w*-)*)abcd(?:(?:-e|-[^e]w*|-e[^d]w*)*)|abcd(?:(?:-e|-[^e]w*|-e[^d]w*)*)))"
这将确保:
- 字符串以
ktm-
或abcd
开头 - 如果以
ktm-
开头,则至少应该有一个名为abcd
的元素 - 如果以
abcd
开头,则不必有其他元素 - 两个选项都检查是否必须有而不是是以
-ed
开头的元素
查看在线演示
没有环顾四周的斗争