事实证明这个问题已经被Kobi在他的这篇博文中解决了。为了简单地平衡不同类型的括号,解决方案非常简单和优雅,并且不像这个问题的答案那么疯狂,它具有更复杂的语法。
\n\n让我引用下面博客文章的主要部分:
\n\n\n\n[...] 谁说我必须将匹配的内容推入堆栈?如果想将任意字符串压入堆栈怎么办?当我看到一个左括号时,我真的想推一个右括号 \xe2\x80\x93 但我该怎么办?
\n\n诀窍是使用前瞻:找到我想要推送的字符的下一个出现位置,然后推送它:
\n\nRun Code Online (Sandbox Code Playgroud)\n\n{(?=.*?(<Stack>}))\n接下来,当我想要匹配右大括号时,堆栈中已经有了正确的大括号。\n 使用这种方法,这里\xe2\x80\x99 是一个正则表达式,它与 3 种不同类型的匹配平衡括号匹配的标记:
\n\nRun Code Online (Sandbox Code Playgroud)\n\n(\n [^(){}\\[\\]]+\n | \\( (?=[^)]* (?<Stack> \\) ) )\n | \\[ (?=[^\\]]* (?<Stack> \\] ) )\n | \\{ (?=[^}]* (?<Stack> \\} ) )\n | \\k<Stack> (?<-Stack>)\n)+?\n(?(Stack) (?!))\n当然,这种方法确实有局限性 \xe2\x80\x93 你可能找不到你\xe2\x80\x99d 想要推送的字符(这可能是一件好事 \xe2\x80\x93 它允许你提前失败) 。如果您想要平衡比常量字符串更复杂的东西,它也会变得更加棘手,但这\xe2\x80\x99是另一个主题。
\n