regex - 重复的任意捕获组
问题描述
给定一个字符串,例如:
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。
更新:我没有在几行代码中做到这一点的奢侈,并且需要在一个正则表达式中做到这一点。正则表达式是在我无法控制的应用程序的配置文件中定义的,因此遗憾的是,不可能使用带有条件等的基于代码的循环。
解决方案
这完全取决于您将其放入的东西的期望。
这是专注于以基本方式让您捕获组的答案,试图避免您将正则表达式放入和 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
推荐阅读
- python - 如何找到已从客户端使用的域以在 python 套接字中到达我的服务器?
- javascript - 在字符串中查找查询匹配项
- python - 考虑到所需的休假,我如何使用 or-tools 安排员工轮班?
- docker - 重复的 RazorLanguageVersionAttribute 构建容器
- python - 连接外显子序列并在其间插入 Ns
- python - 无法在 Linux 上使用 pip 安装 Ropper
- html - 屏幕阅读器可读取切换内容中的列表信息
- upload - 尝试上传反混淆文件时出现错误
- python - 在 Python 中的 List 中查找和添加整数的最快方法
- php - 使用条件向我的数组添加一个新元素