匹配 statsD 格式的正则表达式

Reg-ex to match statsD Format

我正在使用以下正则表达式来匹配 StatsD 数据格式 -

^[\w.]+:.+\|.\|#(?:[\w.]+:[^,\n]+(?:,|$))*$

这满足以下任何一种格式 -

performance.os.disk:1099511627776|g|#region:us-west-1,datacenter:us-west-1a

performance.os.disk:1099511627776|g|#

performance.os.disk:1099511627776|g|#region:us-west-1

但我无法将其与 -

datastore.reads:9876|ms

有什么帮助吗?

尝试正则表达式 101 - https://regex101.com/r/H8vQTa/1/

您可以使用

^[\w.]+:[^|]+\|[^|]+(?:\|#(?:[\w.]+:[^,\n]+(?:,|$))*)?$
               ^^^^^^^^                             ^^

查看 regex demo

关键是你只能在两个|之间匹配任何带有.的字符,我建议在那里匹配除|以外的1个或多个字符,并将其余的设置为可选通过将 \|#(?:[\w.]+:[^,\n]+(?:,|$))* 包装在一个可选的非捕获组中,(?:...)?.

详情

  • ^ - 字符串开头
  • [\w.]+ - 1+ 个单词或 . 个字符
  • : - 冒号
  • [^|]+ - 否定字符 class 匹配 1+ 个非 | 字符
  • \| - 一个 | 字符
  • [^|]+ - |
  • 以外的 1+ 个字符
  • (?:\|#(?:[\w.]+:[^,\n]+(?:,|$))*)? - 可选的非捕获组匹配 1 次或 0 次出现
    • \|# - |# 子字符串
    • (?:[\w.]+:[^,\n]+(?:,|$))* - 连续重复 0 次或多次
      • [\w.]+: - 1+ 个单词或 . 个字符,然后是 :
      • [^,\n]+ - 除了 LF 之外的 1+ 个字符(我猜它在这里用于调试目的)和 ,
      • (?:,|$) - , 或字符串结尾
  • $ - 字符串结尾。