重复的、任意的捕获组
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
给定一个字符串,例如:
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