如何合并正则表达式提取带/不带引号的目标值并保留分组?
合并正则表达式提取带/不带引号的值
可以使用分支重置组((?|...))将三个正则合并为一个,保证原有的分组结构(第1组匹配foo,第2组匹配目标值),同时自动剥离引号:
^(foo):\s*(?|"([^"]*)"|'([^']*)'|(.*))
正则说明:
^(foo):匹配行首的foo并捕获到第1组,和你原有的逻辑一致:\s*:匹配冒号及任意数量的空白字符(兼容多个空格/制表符的情况)(?|...):分支重置组,内部每个分支的捕获组编号会统一重置,确保第2组始终是我们要提取的目标值"([^"]*)":匹配双引号包裹的内容,捕获引号内的文本到第2组'([^']*)':匹配单引号包裹的内容,捕获引号内的文本到第2组(.*):匹配无引号的情况,捕获冒号后所有剩余文本到第2组
匹配示例:
- 输入
foo: "bar"→ 第1组:foo,第2组:bar - 输入
foo: 'bar'→ 第1组:foo,第2组:bar - 输入
foo: bar→ 第1组:foo,第2组:bar - 输入
foo: bar baz→ 第1组:foo,第2组:bar baz(兼容无引号值含空格的场景)
注意事项:
如果无引号的目标值中包含单/双引号,这个正则会提前终止匹配。如果需要支持这种边缘场景,可以进一步调整正则逻辑,但基于你给出的示例场景,上述正则已经足够满足需求。
内容的提问来源于stack exchange,提问作者iAmoric
相关产品推荐
相关产品推荐

