我正在使用以下正则表达式来匹配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
有帮助吗?
RegEx 101可以尝试-https://regex101.com/r/H8vQTa/1/
答案 0 :(得分:3)
您可以使用
^[\w.]+:[^|]+\|[^|]+(?:\|#(?:[\w.]+:[^,\n]+(?:,|$))*)?$
^^^^^^^^ ^^
请参见regex demo
重点是,您只能将两个.
之间的|
字符匹配,我建议在那里匹配|
以外的1个或多个字符,并通过包装使其余字符可选\|#(?:[\w.]+:[^,\n]+(?:,|$))*
在可选的非捕获组(?:...)?
中。
详细信息
^
-字符串的开头[\w.]+
-1个以上的单词或.
个字符:
-冒号[^|]+
-匹配1个以上非|
字符的否定字符类\|
-一个|
字符[^|]+
-除|
以外的1个以上的字符(?:\|#(?:[\w.]+:[^,\n]+(?:,|$))*)?
-一个可选的非捕获组,匹配出现1或0次
\|#
-|#
子字符串(?:[\w.]+:[^,\n]+(?:,|$))*
-的0个或多个连续重复
[\w.]+:
-1个以上的单词或.
个字符,然后是:
[^,\n]+
-除LF(我想这里用于调试目的)和,
(?:,|$)
-,
或字符串结尾$
-字符串的结尾。