重复的、任意的捕获组

repeated, arbitrary capture groups

给定一个字符串,例如:

static_string.name__john.id__6.foo__bar.final_string

但是对于任意数量的 label__value. 组件,我如何重复捕获组,将它们拆分为标签和值,并捕获终止的 final_string ?

对于以上我想要 [name, john, id, 6, foo, bar, final_string]

如果我事先不知道 label__value. 个组件的数量,是否可以这样?

如果重要的话,这是针对 golang / RE2 的。

更新:我没有在几行代码中做到这一点的奢侈,需要在一个正则表达式中做到这一点。正则表达式在我无法控制的应用程序的配置文件中定义,因此不幸的是,基于代码的条件循环是不可能的。

这完全取决于您将其放入其中的期望值。

这个答案的重点是让你以基本的方式获取捕获组,试图避免你将正则表达式放入 "thing" 和 RE2 中的任何问题。

注意:您可能会发现 final_string 使用此方法无法获得您期望的捕获组索引,但这同样取决于您将正则表达式放入的内容。

匹配 "one" 和 "no" key/value 对的正则表达式如下:

^[^.]+(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+))$
  • static_string.final_string
  • static_string.name__john.final_string

为了支持更多 key/value 对,我们重复正则表达式的一部分: 重复部分:

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

所以要支持 2 个键值对,正则表达式是:

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

现在支持以下附加示例:

  • static_string.name__john.foo__bar.final_string

因此,如果我将其扩展为支持 12 个键值对,则正则表达式为:

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

这支持以下附加示例:

  • static_string.name__john.id__6.foo__bar.final_string
  • static_string.name2_1b__john.id__6.foo__bar.final_string
  • static_string.name__john.id__6.foo__bar.name__john.id__6.foo__bar.name__john.id__6.foo__bar.name__john.id__6.foo__bar.final_string