【问题标题】:.NET Regex balancing groups expression - matching when not balanced.NET Regex 平衡组表达式 - 不平衡时匹配
【发布时间】:2010-09-16 01:53:42
【问题描述】:

.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.....

...它仍然匹配!

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

【问题讨论】:

  • 我冒昧地评论了你的正则表达式;只需使用RegexOptions.IgnoreWhitespace 调用它。这对避免爆头综合症非常有帮助:)
  • @Jeff:您可以将IgnoreWhitespace 的规则构建到(?x) # IgnorePatternWhitespace 的模式中。有关示例,请参见 stackoverflow.com/questions/1961369/…

标签: .net regex


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    不是要成为一种杀戮的乐趣,而是你试图用正则表达式做的事情让你大吃一惊,因为这根本不可能。正则表达式是一类有限自动机,没有足够的状态来执行递归/嵌套匹配。您需要某种上下文无关语法才能使其正常工作。

    有些正则表达式引擎确实支持递归概念。不过,这些并不是严格意义上的正则表达式。你能告诉我们你正在使用什么引擎,因为它可能有一个递归函数可以帮助解决这个问题。

    【讨论】:

    猜你喜欢
    • 2015-11-13
    • 2011-12-15
    • 2010-10-07
    相关资源
    最近更新 更多