Regex 重复、任意捕获组

Regex 重复、任意捕获组,regex,go,re2,Regex,Go,Re2,给定一个字符串,例如: static_string.name__john.id__6.foo__bar.final_string 但是,对于任意数量的label\u值。组件,我如何重复捕获组,将它们拆分为label&value,并捕获最终的\u字符串 对于以上内容,我希望[name,john,id,6,foo,bar,final\u string] 当我事先不知道label\uu值。组件的数量时,是否可能出现这种情况 这是针对golang/RE2的,如果这很重要的话 更新:我没有在几行代码中完

给定一个字符串,例如:

static_string.name__john.id__6.foo__bar.final_string
但是,对于任意数量的
label\u值。
组件,我如何重复捕获组,将它们拆分为label&value,并捕获最终的\u字符串

对于以上内容,我希望[
name
john
id
6
foo
bar
final\u string
]

当我事先不知道
label\uu值。
组件的数量时,是否可能出现这种情况

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


更新:我没有在几行代码中完成这项工作的奢侈,并且需要在单个正则表达式中完成这项工作。正则表达式是在我不控制的应用程序的配置文件中定义的,因此很遗憾,使用条件等的基于代码的循环是不可能的

这完全取决于你所投入的东西期望什么

这是一个答案,重点是以一种基本的方式让您获得捕获组,试图避免您将regex放入和RE2中的“东西”出现任何问题

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

匹配“一”和“否”键/值对的正则表达式如下所示:

^[^.]+(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+))$
  • 静态字符串。最终字符串
  • static\u string.name\u john.final\u string

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

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

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

^[^.]+(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+))$
^[^.]+(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+))$
现在,它支持以下附加示例:

  • static\u string.name\u john.foo\u bar.final\u string

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

^[^.]+(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+))$
^[^.]+(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+?)__([^.]+))?(?:\.([^.]+))$
这支持以下附加示例:

  • static\u string.name\u john.id\u 6.foo\u bar.final\u string
  • static\u string.name2\u 1b\u john.id\u 6.foo\u bar.final\u string
  • static\u string.name\u john.id\u 6.foo\u bar.name\u john.id\u 6.foo\u bar.name\u john.id\u 6.foo\u bar.name\u john.id\u 6.foo\u bar.final\u string

我不精通围棋,这在java中相当简单,你确定一个捕获组,然后循环搜索结果,因此在围棋中寻找类似的东西我发现了这一点,这可能会有所帮助:当你说“任意数量的
标签值
”时,是否存在最大发生次数?@DeanTaylor yes,大概在10个ishI的范围内点击accept,因为这让我更接近我想要的,但是你知道有没有一种方法可以用未知数量的键值对来实现这一点吗?@DanielleM。我不是,不是没有额外的编码,即不仅仅是一个正则表达式。@DanielleM。也不觉得有必要点击“接受”,你可以让它打开,也许其他人比我更清楚。也许下次再来看看。