我正在使用Google 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
以某种方式this regex
\bkey="(abcd(?:-\w+)*[^-][^e][^d]\w)"
..满足第一个条件abcd-
,但不满足第二个条件(否定-ed
)。
第二个输入选项的预期输出为abcd-eest-xyz-bnn
。任何帮助将非常感激。非常感谢。
答案 0 :(得分:4)
如果我正确理解了您的要求,则以下模式应该有效:
\bkey="(abcd(?:-e|-(?:[^e\W]|e[^d\W])\w*)*)"
Demo 。
重要部分的故障:
(?: # Start a non-capturing group.
-e # Match '-e' literally.
| # Or the following...
- # Match '-' literally.
(?: # Start a second non-capturing group.
[^e\W] # Match any word character except 'e'.
| # Or...
e[^d\W] # 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'开头的单词,后面没有'd'。
* 这里的“单词”表示正则表达式中定义的一串单词字符。
答案 1 :(得分:1)
也许可以:
\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
开头的元素。查看在线demo
没有环顾四周的斗争...