如何使用re2正则表达式否定字符串模式?

时间:2020-07-23 19:27:14

标签: regex prometheus grafana re2

我正在使用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。任何帮助将非常感激。非常感谢。

2 个答案:

答案 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

没有环顾四周的斗争...