给出一个字符串,例如:
static_string.name__john.id__6.foo__bar.final_string
但是具有任意数量的label__value.
组件,我如何重复捕获组,将它们分成标签和值,还捕获终止的final_string?
对于上述情况,我想要[name
,john
,id
,6
,foo
,bar
,{{1 }}]
当我事先不知道final_string
组件的数量时,是否有可能这样?
这对golang / RE2来说很重要。
更新:我没有用几行代码来完成此操作,因此需要在单个正则表达式中执行此操作。正则表达式是在我不控制的应用程序的配置文件中定义的,因此不幸的是,基于代码的带有条件等的循环是不可能的。
答案 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