.NET Regex平衡组表达式 - 在不平衡时进行匹配

时间:2008-10-08 17:14:46

标签: .net regex

.NET balanced group regexes让我头晕目眩。我有这个字符串我想要匹配:

other stuff blah blah....
                    {
                        stuff stuff
                        {key:
                            stuff
                            stuff
                        }
                    } more stuff.....

这是我的正则表达式:

[^{}]*                      # anything that isn't { }
\{                          # starting with {
(?>                         # atomic group: throw away backtracks on exit
    [^{}]+
  |
    \{(?:\w+:)?(?<DEPTH>)   # on matching { plus optional "word:" push stack  
  |
    \}(?<-DEPTH>)           # on matching } pop stack
)*
(?(DEPTH)(?!))              # if depth unbalanced, fail match
\}                          # ending with }
[^{}]*                      # anything that isn't { }

所以,我正在尝试匹配平衡花括号,其中一些开口花括号有一个可选单词后跟一个冒号。上面的正则表达式匹配我的示例字符串,但如果我删除一个大括号,(即“不平衡它”):

    other stuff blah blah....
                    {
                        stuff stuff
                        {key:
                            stuff
                            stuff

                    } more stuff.....

......它仍然匹配!

有谁能告诉我如何修复我的正则表达式?

2 个答案:

答案 0 :(得分:4)

你在第二种情况下检查过匹配的内容吗?由于你没有任何锚点,我认为引擎在第一个'{'之后开始匹配。从那里开始,直到结束,字符串匹配。

尝试使用\ A和\ z包围模式。

答案 1 :(得分:-1)

不要成为一种杀戮的快乐,但是你试图用正则表达式做的事情令人难以置信,因为这根本不可能。正则表达式是一类有限自动机,并且没有足够的状态来执行递归/嵌套匹配。你需要一个无上下文的语法才能使这个工作。

有一些正则表达式引擎支持递归的概念。但这些并不是严格意义上的正则表达式。你能告诉我们你正在使用什么引擎,因为它可能有一个递归功能,这将有助于这种情况。