【问题标题】:How to negate string pattern using re2 regex?如何使用 re2 正则表达式否定字符串模式?
【发布时间】:2020-11-13 14:56:34
【问题描述】:

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

【问题讨论】:

    标签: regex prometheus grafana re2


    【解决方案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

    没有环视的斗争...

    【讨论】:

    • 不,伙计。但是,它与密钥一起具有价值。只需要值。而且,经过几次尝试,我得到了它。请检查此link。谢谢你的努力。相反,你在这里的贡献是巨大的。赞赏。我正在尝试另一个在匹配两个条件但不否定(不满足否定)的值上应用正则表达式。如果你想贡献请参考link谢谢!
    • @CdVr。唯一缺少的是捕获组单独获取值。查看更新。
    • 对第二个链接/以下链接有任何想法吗? link 否定不起作用!
    • 我给出的答案是你想要的。我不明白你想在链接中显示什么
    • 我的意思是 this 满足 2 个匹配情况,但不满足其中 -ed 的 notMatch 情况。即使该字符串中包含-ed,它也会返回true。希望这很清楚!
    【解决方案2】:

    如果我正确理解您的要求,以下模式应该可以工作:

    \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'开头。 或者..
    • 以“e”开头的单词,后跟“d”。

    *这里的“单词”是指正则表达式中定义的一串单词字符。

    【讨论】:

    • 如果我没记错的话,我想你可以删除第一个-e|。不错的模式++
    • 只是想明白,如果我需要否定字母模式 -edf 那么呢?我需要像下面那样做吗? \bkey="(abcd(?:-e|-(?:[^e\W]|e[^d\W]|ed[^f\W])\w*)*)"
    • @Thefourthbird 谢谢!我不确定 OP 在每个连字符后期望的最小字符数是多少。如果是一个,那么我相信需要 -e| 部分,否则,它不会在连字符后单独接受 e 。例如,如果最小值为 2,则不需要 -e|,但我们需要在第一个字符类之后再抛出一个 \w
    • @CdVr 你离得太近了。在这种情况下,我只会使用-ed?| 而不是-e|。请参阅demo
    • 这是对的。但我需要介绍另一种情况。总的来说,我需要在这两种情况下都否定-ed。在第一种情况下,字符串应该以abcd- 开头并否定-ed 第二种情况是,当字符串以ktm- 开头时,它还应该包含abcd- 和否定-ed。我现在清楚了吗? @JvdV
    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 2015-10-17
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2015-11-28
    相关资源
    最近更新 更多