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



我使用谷歌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开头的元素

查看在线演示

没有环顾四周的斗争