【问题标题】:Regex to get value from <key, value> by asserting conditions on the value正则表达式通过在值上断言条件从 <key, value> 获取值
【发布时间】:2020-07-15 06:25:10
【问题描述】:

我有一个正则表达式,它从给定键中获取值,如下所示

正则表达式.*key="([^"]*)".* InputValue key="abcd-qwer-qaa-xyz-vwxc"

输出abcd-qwer-qaa-xyz-vwxc

但是,除此之外,我需要验证该值仅以 abcd- 开头,并且以下模式与 -xyz 匹配

因此,输入和输出必须如下:

我在下面尝试过,但没有按预期工作

.*key="([^"]*)"?(/Babcd|-xyz).*

键值对是大字符串的一部分,如下所示:

object{one="ab-vwxc",two="value1",key="abcd-eest-wd-xyz-bnn",four="obsolete Values"}

我认为通过匹配键来获取值,这就是我使用的.*key="([^"]*)".*

注意: 它是一个仪表板。您可以参考此link 并搜索Regex: /"([^"]+)"/ 此正则表达式应用于查询结果,这是我提到的字符串。它使用上面的正则表达式.*key="([^"]*)".*。我正在尝试使用该 regexGroup 本身进行更改。希望这会有所帮助?

有人可以指导或建议我吗?那会很有帮助。谢谢!

【问题讨论】:

  • 离题,但您应该重新审视您之前提出的问题,看看您是否可以投票/接受任何给出的答案。其简单的礼貌和如何这个网站works
  • 对于@JvdV 的评论,给出的链接包含以下文字:“接受并不意味着它是最好的答案,它只是意味着它对提出问题的人有用。”。这可能是政策,但我认为在实践中提问者倾向于选择他们认为最有帮助的答案(前提是至少有一个是有帮助的)。尽管鼓励选择答案,但您可能希望稍等片刻再这样做,主要是因为快速选择可能会阻止一些读者发布其他答案。

标签: regex prometheus grafana grafana-variable


【解决方案1】:

看起来你可以这样做:

\bkey="(abcd(?=.*-xyz\b)(?:-[a-z]+){4})"

查看演示online

  • \bkey=" - 单词边界和字面匹配 'key="'
  • ( - 打开第一个捕获组。
    • abcd - 字面上匹配 'abcd'。
    • (?=.*-xyz\b) - 零个或多个字符(但换行符)的正向前瞻,后跟字面上的 '-xyz' 和单词边界。
    • (?: - 打开非捕获组。
      • -[a-z]+ - 匹配连字符后跟至少一个小写字母。
      • ){4} - 关闭非捕获组并匹配 4 次。
    • ) - 关闭第一个捕获组。
  • " - 匹配文字双引号。

我不是 100% 确定您只想允许使用小写字母,因此您可以在需要时调整该部分。整个模式验证输入值,而您可以使用捕获组一来获取您的密钥。



更新在使用新信息编辑问题后:

Prometheus 在 all 正则表达式中使用 RE2 引擎。因此,由于环视,上述建议将不起作用。对 OP 的限制较少但可能的答案可能是:

\bkey="(abcd(?:-\w+)*-xyz(?:-\w+)*)"

在线查看demo

【讨论】:

  • 通过解释必须应用正则表达式的完整输入来更新问题。抱歉错过了。你能更新答案吗?对于单键,重视它的工作。但是键值是我编辑的问题中大字符串的一部分。谢谢。
  • @JvdV 您是如何生成该图像的?
  • @Bren。我是从here 那里得到的
  • @JvdV 在编辑器中很好。但我真正的实现在于另一个不返回任何内容的应用程序。但它返回位于link 右窗格中的Group 1 值。无论如何使用组概念来更新链接中的现有链接?
  • 你说的这个“应用程序”是什么。看起来你可能想用一些更相关的信息来更新你的 OP。如果您无法与小组合作,请尝试:(?&lt;=\bkey=")abcd(?=.*-xyz\b)(?:-[a-z]+){4}(?=")。它基本上是相同的验证,但具有积极的外观。
【解决方案2】:

这行得通吗?

模式

\bkey="(abcd-[^"]*\bxyz\b[^"]*)"

Demo

【讨论】:

  • 通过解释必须应用正则表达式的完整输入来更新问题。抱歉错过了。你能更新答案吗?对于单键,重视它的工作。但是键值是我编辑的问题中大字符串的一部分。谢谢。
  • @venkat 立即尝试
【解决方案3】:

您可以使用以下正则表达式来验证字符串是否具有所需的格式并匹配字符串中感兴趣的部分。

(?<=\bkey=")(?=.*-xyz(?=-|$))abcd(?:-[a-z]+)+(?=")

Start your engine!

注意没有捕获组。

正则表达式引擎执行以下操作。

(?<=\bkey=")  : positive lookbehind asserts the current
                position in the string is preceded by 'key=' 
(?=           : begin positive lookahead
  .*-xyz      : match 0+ characters, then '-xyz'
  (?=-|$)     : positive lookahead asserts the current position is
              : followed by '-' or is at the end of the string
)             : end non-capture group
abcd          : match 'abcd'
(?:           : begin non-capture group
  -[a-z]+     : match '-' followed by 1+ characters in the class
)+            : end non-capture group and execute it 1+ times
(?=")         : positive lookahead asserts the current position is
              : followed by '"'

【讨论】:

  • 我刚刚发现Prometheus使用了RE2引擎=(
  • @JvdV,我不这么认为。除了普罗米修斯甚至不是真人这一事实之外,RE2 引擎在他的功绩之后很久就发布了。
  • 我看到你在那里做了什么=)。自我提醒:在 Cary 周围看我的英语。
  • 我找不到否定模式的方法。有什么解决方法吗?类似于下面的 SOF 问题reference link
猜你喜欢
  • 2014-12-03
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多