控制平衡括号

Ove*_*ive 5 .net c# regex

假设我们有一个包含不同括号的字符串(在此上下文中用括号表示(,[{),字符串也可以包含其他类似的内容,{[balanced(parenthesis)]}但其余内容将在很大程度上被忽略.是否可以使用正则表达式来控制所有不同的括号:

  1. "关闭",即每个"开口"括号与"结束"括号匹配,并且
  2. 在字符串中的正确位置?

nha*_*tdh 4

事实证明这个问题已经被Kobi在他的这篇博文中解决了。为了简单地平衡不同类型的括号,解决方案非常简单和优雅,并且不像这个问题的答案那么疯狂,它具有更复杂的语法。

\n\n

让我引用下面博客文章的主要部分:

\n\n
\n

[...] 谁说我必须将匹配的内容推入堆栈?如果想将任意字符串压入堆栈怎么办?当我看到一个左括号时,我真的想推一个右括号 \xe2\x80\x93 但我该怎么办?

\n\n

诀窍是使用前瞻:找到我想要推送的字符的下一个出现位置,然后推送它:

\n\n
{(?=.*?(<Stack>}))\n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来,当我想要匹配右大括号时,堆栈中已经有了正确的大括号。\n 使用这种方法,这里\xe2\x80\x99 是一个正则表达式,它与 3 种不同类型的匹配平衡括号匹配的标记:

\n\n
(\n    [^(){}\\[\\]]+\n    | \\( (?=[^)]*  (?<Stack> \\) ) )\n    | \\[ (?=[^\\]]* (?<Stack> \\] ) )\n    | \\{ (?=[^}]*  (?<Stack> \\} ) )\n    | \\k<Stack> (?<-Stack>)\n)+?\n(?(Stack) (?!))\n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,这种方法确实有局限性 \xe2\x80\x93 你可能找不到你\xe2\x80\x99d 想要推送的字符(这可能是一件好事 \xe2\x80\x93 它允许你提前失败) 。如果您想要平衡比常量字符串更复杂的东西,它也会变得更加棘手,但这\xe2\x80\x99是另一个主题。

\n
\n

  • 优雅美丽。这正是我一直在寻找的。 (2认同)