重复的任意捕获组

时间:2019-07-26 17:30:26

标签: regex go re2

给出一个字符串,例如:

static_string.name__john.id__6.foo__bar.final_string

但是具有任意数量的label__value.组件,我如何重复捕获组,将它们分成标签和值,还捕获终止的final_string?

对于上述情况,我想要[namejohnid6foobar,{{1 }}]

当我事先不知道final_string组件的数量时,是否有可能这样?

这对golang / RE2来说很重要。

更新:我没有用几行代码来完成此操作,因此需要在单个正则表达式中执行此操作。正则表达式是在我不控制的应用程序的配置文件中定义的,因此不幸的是,基于代码的带有条件等的循环是不可能的。

1 个答案:

答案 0 :(得分:2)

这完全取决于您对它的期望。

这个答案的重点是以一种基本的方式为您提供捕获组,以尝试避免将正则表达式放入RE2的“问题”。

注意:您可能会发现final_string没有获得您期望的使用此方法的捕获组索引,但是还是取决于您将正则表达式放入什么位置。

与以下“键” /“值”对匹配的正则表达式为:

^[^.]+(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+))$
  • 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
相关问题