Выражение балансировочных групп .NET Regex - сопоставление, когда не сбалансировано - PullRequest
1 голос
/ 08 октября 2008

регулярные выражения сбалансированной группы .NET заставляет мою голову взорваться. У меня есть строка, которую я пытаюсь найти:

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 ]

4 голосов
/ 08 октября 2008

Вы проверили, что соответствует во втором случае? Поскольку у вас нет якорей, я думаю, что двигатель запускает матч сразу после первого '{'. Оттуда до конца строка совпадает.

Попробуйте окружить шаблон \ A и \ z.

0 голосов
/ 08 октября 2008

Не быть убийственной радостью, но то, что вы пытаетесь сделать с помощью регулярного выражения, поражает ваш разум, потому что это просто невозможно. Регулярные выражения являются классом конечных автоматов и не обладают достаточным состоянием, в котором можно выполнить рекурсивное / вложенное сопоставление. Вам понадобится не зависящая от контекста грамматика, чтобы это работало.

Существуют некоторые механизмы регулярных выражений, которые поддерживают понятие рекурсии. Это не строго говоря регулярные выражения, хотя. Можете ли вы сказать нам, какой движок вы используете, потому что, возможно, у него есть функция рекурсии, которая поможет этому сценарию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...