【问题标题】:Split and capture hyphenated string拆分和捕获连字符字符串
【发布时间】:2021-03-08 14:00:55
【问题描述】:

我们的机器名称的结构类似于 - 例如“S01-邮件-M01”。我希望能够将“S01”、“MAIL”、“M01”捕获为 $1、$2、$3,但我无法使用正则表达式,我真的没有使用它们的经验。

我正在测试 /(.*)\-+/ 之类的东西,但是当我在 https://regex101.com/ 上测试时,这会捕获“S01-MAIL”

我在 Prometheus 配置脚本中执行此操作,所以像 Split 这样明显的编程工具不可用,只有正则表达式。

【问题讨论】:

  • 如果支持,您可以使用 3 个捕获组 ^(\w+)-(\w+)-(\w+)$^([^-]+)-([^-]+)-([^-]+)$ regex101.com/r/UU3eLk/1
  • 这可以推广到 N 个组而不是硬编码为 3 个吗?
  • 我认为 prometheus 使用 re2 引擎进行正则表达式。如果您想按编号访问单独的组,则必须指定所有 3 个。
  • 您最多查看多少组?如果您愿意,可以创建可选的捕获组,如 ^(\w+)(?:-(\w+))?(?:-(\w+))?$ 并在需要时对其进行扩展。

标签: regex prometheus


【解决方案1】:

对于我的示例,我假设机器名称在标签instance 中,它应分为datacenterservicenode_number

您需要三个重新标记规则:

relabel_configs:
  - source_labels: instance
    target_label: datacenter
    regex: ^(\w+)-\w+-\w+$
  - source_labels: instance
    target_label: service
    regex: ^\w+-(\w+)-\w+$
  - source_labels: instance
    target_label: node_number
    regex: ^\w+-\w+-(\w+)$

每个规则提取一个元素并将其放入单独的标签中。

【讨论】:

  • 感谢普罗米修斯特定的答案。你不应该使用$1 而不是$ 还是这是允许的速记?
  • 一开始我有一个规则replacement: $1,我假设你参考了那个。由于是默认的,所以不需要配置,所以我去掉了。
  • 哦,我想知道为什么你的正则表达式以$结尾
  • 如果输入在该位置结束,则匹配。如果它被遗漏,它将匹配一个输入字符串,如“S01-MAIL-M01 something else”
【解决方案2】:

以下正则表达式分为 3 个捕获组 /([A-Z0-9]+)/gm

https://regex101.com/r/otfJXW/1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多