Warm tip: This article is reproduced from serverfault.com, please click

perl-正则表达式:捕获括号内的任何内容,也嵌套嵌套的括号

(perl - Regex: capture anything within parenthesis, also nested parenthesis)

发布于 2020-11-30 11:52:53

我知道这可能是一个重复的问题,但是请相信我,我已经搜索并尝试过,但是没有找到匹配的解决方案,因此希望你能对我有所帮助。

我正在尝试将一些显示为“键(值),键(值)”的文本输出分析为散列,并且我成功完成了此操作,但是只要我的值包含括号,捕获就不会完成,而只会捕获直到内部结束括号。

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

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

第一个捕获组是关键,第二个捕获组应为值。如你所见,带有值'mqconnectlog.so(LogExit)'的SCYEXIT密钥仅会捕获到内部结束括号为止:'mqconnectlog.so(LogExit'

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

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

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

有什么办法可以解决这个问题?

Questioner
Stijn De Schutter
Viewed
11
Shawn 2020-11-30 20:48:17

你可以使用递归正则表达式(假设parens总是要保持平衡):(\S+?)(\(((?:(?>[^()]+)|(?2))*)\))取自perlreRegex101上查看它的运行情况第一个捕获组是键,第二个是外部括号的值,第三个是内部括号的值。