首页 > 解决方案 > 重复的任意捕获组

问题描述

给定一个字符串,例如:

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。

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

标签: regexgore2

解决方案


这完全取决于您将其放入的东西的期望。

这是专注于以基本方式让您捕获组的答案,试图避免您将正则表达式放入和 RE2 的“事物”的任何问题。

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

匹配“one”和“no”键/值对的正则表达式如下:

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

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

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

因此,为了支持 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

推荐阅读