我知道这可能是一个重复的问题,但是请相信我,我已经搜索并尝试过,但是没有找到匹配的解决方案,因此希望你能对我有所帮助。
我正在尝试将一些显示为“键(值),键(值)”的文本输出分析为散列,并且我成功完成了此操作,但是只要我的值包含括号,捕获就不会完成,而只会捕获直到内部结束括号。
regex used: (\S+?)\((.+?)\)
这是文本输入==> Regex101的示例
第一个捕获组是关键,第二个捕获组应为值。如你所见,带有值'mqconnectlog.so(LogExit)'的SCYEXIT密钥仅会捕获到内部结束括号为止:'mqconnectlog.so(LogExit'
我还尝试了一些具有相同结果的变体:
(\S+?)\(([^)]+)\)
(\S+?)\(([^)]+(?=\)))\)
我认为这里最大的问题是我需要使两个捕获组都变得懒惰,因为同一行上有多个“键(值)”对,否则它将捕获过多的字符,并且还会包含下一个“键(值)”中的字符)'从同一行开始。
有什么办法可以解决这个问题?
是的,如果那里有parens,它们将始终保持平衡。谢谢,这是一个很好的解决方案,我只需要记住,我现在有3个捕获组,而不是2个,但这只是一个小细节。将对这些递归正则表达式进行更多研究,因为这对我来说是全新的。感谢您的帮助!
@StijnDeSchutter如果此部分
(\S+?
不匹配括号,则也可以使用否定的字符类将那些匹配的字符排除在匹配之外,从而防止某些回溯([^\s()]+)(\(((?:(?>[^()]+)|(?2))*)\))
regex101.com/r/TZehdD/1