首页 > 解决方案 > 正则表达式:捕获括号内的任何内容,也包括嵌套括号

问题描述

我知道这似乎是一个重复的问题,但相信我,我搜索并尝试了但没有找到匹配的解决方案,所以希望你能帮助我。

我正在尝试将一些显示为“键(值)键(值)”的文本输出分析为哈希,我已经成功地做到了,但是每当我的值包含括号时,捕获不完整,它只捕获直到内部右括号。

regex used: (\S+?)\((.+?)\)

这是文本输入 ==> Regex101的示例

第一个捕获组是键,第二个捕获组应该是值。如您所见,值为 'mqconnectlog.so(LogExit)' 的 SCYEXIT 键只捕获到内部右括号:'mqconnectlog.so(LogExit'

我还尝试了一些具有相同结果的变体:

(\S+?)\(([^)]+)\)
(\S+?)\(([^)]+(?=\)))\)

我认为这里最大的问题是我需要使两个捕获组都变得懒惰,因为同一行上有多个“键(值)”对,否则它会捕获太多字符并且还包括来自下一个键(值)的字符)' 对来自同一行。

有没有办法解决这个问题?

标签: regexperlnestedparentheses

解决方案


您可以使用递归正则表达式(假设括号总是平衡的):(\S+?)(\(((?:(?>[^()]+)|(?2))*)\))取自perlre。在Regex101中查看它的实际应用。第一个捕获组是键,第二个是带有外部括号的值,第三个是括号内的值。


推荐阅读