Regex вложенная структура со специальными charaters - PullRequest
2 голосов
/ 10 марта 2020

Мне нужно найти регулярное выражение в C#, которое сопоставляет и возвращает строки из вложенной структуры, разделенной $ (and) $.

Моя входная строка:

$(string1$(string2)$sometexthere$(string3$(string4)$texttext)$anothertext)$

Вывод должен быть:

$(string1$(string2)$sometexthere$(string3$(string4)$texttext)$anothertext)$
$(string2)$
$(string3$(string4)$texttext)$
$(string4)$

Я пытался с этим регулярным выражением \$\([^\$]*\)\$, но он возвращает только самые внутренние string2 и string4.

Есть ли решение вернуть каждое совпадение с регулярным выражением? или даже через al oop? ($( и )$ могут быть заменены после [ и ])

1 Ответ

2 голосов
/ 10 марта 2020

Вы можете использовать

(?=(?<result>\$\((?>[^()]+|(?<o>\()|(?<-o>\)))*(?(o)(?!))\)\$))

См. Демоверсию regex , захватить каждый match.Groups["result"].Value.

enter image description here

C# фрагмент кода:

var pattern = @"(?=(?<result>\$\((?>[^()]+|(?<o>\()|(?<-o>\)))*(?(o)(?!))\)\$))";
var results = Regex.Matches(text, pattern)
        .Cast<Match>()
        .Select(x => x.Groups["result"].Value)
        .ToList();

См. Демонстрационную версию C# онлайн .

Детали шаблона

  • (?= - положительный прогноз, позволяющий перекрывать совпадения:
    • (?<result>\$\((?>[^()]+|(?<o>\()|(?<-o>\)))*(?(o)(?!))\)\$) - «результат» группы:
      • \$\( - $( подстрока
      • (?>[^()]+|(?<o>\()|(?<-o>\)))* - 1+ символов, отличных от ( и ) или (, помещенных в стек групп «o» или ), извлеченных из стека групп «o», 0 или более раз
      • (?(o)(?!)) - условие, которое не соответствует, если стек группы "o" не пуст
      • \)\$ - подстрока )$
  • ) - конец заглядывания
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...