【问题标题】:Regex alternation doesn't work as expected正则表达式替换不能按预期工作
【发布时间】:2018-09-27 19:18:35
【问题描述】:

这是我的正则表达式:

^\/(var\/lib\/docker|kubelet)|(run\/docker\/netns\/).*

这里是需要捕获的字符串。

/var/lib/docker/pods/9bbc0d82-be96-11e8-9217
/var/lib/kubelet/pods/9bbc0d82-be96-11e8-9217

这会捕获 "/var/lib/docker" 而不是 "/var/lib/kubelet" 。 我在这里错过了什么?

我在 node_exporter 服务文件中使用它,所以甚至不确定它使用的是哪种正则表达式。

【问题讨论】:

  • 您的括号放错了位置:您告诉引擎在一侧捕获var\/lib\/docker 或在另一侧捕获kebelet。分解,你应该完成。
  • 要匹配其中任何一个,请尝试在非捕获组中使用替代 (?:docker|kubelet)

标签: regex prometheus


【解决方案1】:

括号的位置使替代选项var/lib/dockerkubelet。如果您希望替代品为dockerkubelet,则应该是这样的:

^\/(var\/lib\/(docker|kubelet))|(run\/docker\/netns\/).*

注意括号括起来“docker|kubelet”而不是:

(var\/lib\/docker|kubelet)"

【讨论】:

  • 将交替放入非捕获组(即(?:docker|kubelet)as someone said in the comments以避免破坏捕获组的顺序。
  • 太棒了,这几乎达到了我想要的效果,但是它将“docker”或“kubelet”词放在单独的组下,同时按照@The第四只鸟提到的那样做 (?:docker|kubelet) - 保持组一起。谢谢!
【解决方案2】:

您应该使用非捕获组(?:docker|kubelet),否则您将匹配/var/lib/docker/kubelet

\/(var\/lib\/(?:docker|kubelet))|(run\/docker\/netns\/).*

Regex demo

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 1970-01-01
    • 2014-04-28
    • 2011-03-06
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多