встроенное регулярное выражение {{соответствие - PullRequest
7 голосов
/ 14 мая 2011

Мне нужно соответствовать следующему утверждению:

{{CalendarCustom|year={{{year|{{#time:Y}}}}}|month=08|float=right}}

В основном, когда есть {, должен присутствовать соответствующий }, хотя многие встроенные { } находятся внутри исходного тега. Так например {{match}} или {{ma{{tch}}}} или {{m{{a{{t}}c}}h}}.

У меня есть это прямо сейчас:

(\{\{.+?(:?\}\}[^\{]+?\}\}))

Это не совсем работает.

Ответы [ 2 ]

15 голосов
/ 14 мая 2011

.NET regex engine позволяет рекурсивное сопоставление:

result = Regex.Match(subject,
    @"\{                   # opening {
        (?>                # now match...
           [^{}]+          # any characters except braces
        |                  # or
           \{  (?<DEPTH>)  # a {, increasing the depth counter
        |                  # or
           \}  (?<-DEPTH>) # a }, decreasing the depth counter
        )*                 # any number of times
        (?(DEPTH)(?!))     # until the depth counter is zero again
      \}                   # then match the closing }",
    RegexOptions.IgnorePatternWhitespace).Value;
4 голосов
/ 14 мая 2011

Я предлагаю написать для этого простой парсер / токенизатор.

По сути, вы перебираете все символы и начинаете считать экземпляры { и } - увеличивая для { и уменьшая для }. Запишите индекс каждого первого { и индекс каждого последнего }, и у вас будут индексы для ваших встроенных выражений.

На данный момент вы можете использовать substring, чтобы получить их и удалить / заменить их из исходной строки.

См. этот вопрос и ответы о том, почему RegEx не подходит.

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