如何在递归模式中匹配但不包括分隔符

3
假设有一个字符串{a:b,c:d},{a:b,c:d,e:[{d:e},{f:g}]},我想将其解析为标记a:b,c:d a:b,c:d,e:[{d:e},{f:g}],以便稍后进一步解析。
正则表达式({(?:[^{}]++|(?1))*})产生了{a:b,c:d} {a:b,c:d,e:[{d:e},{f:g}]},但我卡在了如何匹配封闭的{}而不将它们包含在结果中。(该字符串可能包含比示例中未显示的更深层次的递归元素)

1
捕获它们,{((?:[^{}]++|(?R))*)},请参见demo - Wiktor Stribiżew
@WiktorStribiżew 看起来像是一个答案,除非 M Webjorn 需要整个匹配作为结果。 - Ryszard Czech
谢谢!太好了!有什么建议如何将第二个项目 a:b,c:d,e:[{d:e},{f:g}] 解析成 a:b, c:d, e:[{d:e},{f:g}] 吗?与上面使用的相同方法导致正则表达式由于无限递归而失败。 - M Webjorn
在同一个正则表达式中是不可能的。需要进行第二次匹配。类似于 (\w+):((\[(?:[^][]++|(?3))*])|\w+) - Wiktor Stribiżew
找到了解决方案:应用于 a:b,c:d,e:[{d:e},{f:g}] 的正则表达式 ([^,\[]+(?:\[(?:[^\[\]]++)\])?) 会产生 a:b, c:d,e:[{d:e},{f:g}] - M Webjorn
1个回答

2

您需要“捕获”正则表达式中需要从匹配中提取的部分:

{((?:[^{}]++|(?R))*)}
 ^_________________^

这些括号创建了第一组,您可以使用编程语言访问其中包含的值。

获取匹配项后,您可以运行第二个步骤来提取a:ba:[...]子字符串,使用:

[^,[]+(?:\[[^][]+])?

请参见正则表达式演示。细节如下:

  • [^,[]+ - 匹配零个或多个非[和逗号的字符。
  • (?:\[[^][]+])? - 可选的序列,包括一个[,然后是一个或多个非[]的字符,最后是一个]

只需在第二个解析器上添加一些 \ 以澄清 [^,\[]+(?:\[[^\]\[]+\])? - M Webjorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接