正则表达式从带有顺序组的分隔字符串解析

时间:2018-01-12 17:52:19

标签: regex regex-group prometheus

我试图解析分隔字符串中的单词,并按顺序排列捕获组。例如

dog.cat.chicken.horse.whale

我知道([^.]+)可以解析每个单词,但这会将每个字符串放在捕获组1中。

Match 1
Full match  0-3 `dog`
Group 1.    0-3 `dog`
Match 2
Full match  4-7 `cat`
Group 1.    4-7 `cat`
Match 3
Full match  8-15    `chicken`
Group 1.    8-15    `chicken`
Match 4
Full match  16-21   `horse`
Group 1.    16-21   `horse`
Match 5
Full match  22-27   `whale`
Group 1.    22-27   `whale`

我真正需要的是像

Match 1
Full match  0-27    `dog.cat.chicken.horse.whale`
Group 1.    0-3 `dog`
Group 2.    4-7 `cat`
Group 3.    8-15    `chicken`
Group 4.    16-21   `horse`
Group 5.    22-27   `whale`

我尝试了多次迭代但没有成功,有人知道怎么做吗?

1 个答案:

答案 0 :(得分:1)

这种情况没有好的解决方案。您可能要做的就是添加可选的non-capturing groups和捕获的<{3>}来计算一些设置的组数。

所以,它可能看起来像

([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)(?:\.([^.]+))?(?:\.([^.]+))?(?:\.([^.]+))?

依此类推,只需添加更多(?:\.([^.]+))?,直到达到应定义的限制为止。

请参阅regex demo

请注意,您可能希望锚定模式以避免部分匹配:

^([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)\.([^.]+)(?:\.([^.]+))?(?:\.([^.]+))?(?:\.([^.]+))?$

^匹配字符串的开头,$断言字符串末尾的位置。