Как лучше всего разбирать строки и вложенные скобки в C#? - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь написать программу, которая берет обычную строку с кавычками и вложенными скобками и разбивает их на список.

Пока что я использую этот RegEX: @"[\""].+?[\""]|\{.*\}|(?=\()(?:(?=.*?\((?!.*?\1)(.*\)(?!.*\2).*))(?=.*?\)(?!.*?\2)(.*)).)+?.*?(?=\1)[^(]*(?=\2$)|[^ ]+"

Я хочу, чтобы он сделал следующее: if (eval (date day) == "14") {print "Today is the 14th"} else {print "It is not the 14th"}

if
(eval (date day) == "14")
{print "Today is the 14th"}
else
{print "It is not the 14th"}

, но он возвращается как

if
(eval (date day) == "14")
{print "Today is the 14th"} else {print "It is not the 14th"}

У меня была эта проблема с круглыми скобками, и я нашел решение в Интернете, но когда я попытался изменить его для работы с {}, не работает.

Я читал в Интернете, что RegEX не работает, но я не нашел нового решения. Есть ли способ сделать это?

1 Ответ

1 голос
/ 15 июля 2020

Если разделителями являются () и {} и вы хотите игнорировать строковое содержимое, которое может содержать разделители, вам просто нужно использовать сбалансированное текстовое регулярное выражение.

(?:[^(){}]+|(?:(?:(?'opP'\()(?>[^()"]+|"[^"]*")*)+(?:(?'clP-opP'\))(?>[^()"]+|"[^"]*")*?)+)+(?(opP)(?!))|(?:(?:(?'opBr'\{)(?>[^{}"]+|"[^"]*")*)+(?:(?'clBr-opBr'\})(?>[^{}"]+|"[^"]*")*?)+)+(?(opBr)(?!)))

C# образец

Regex RxParts = new Regex(@"(?:[^(){}]+|(?:(?:(?'opP'\()(?>[^()""]+|""[^""]*"")*)+(?:(?'clP-opP'\))(?>[^()""]+|""[^""]*"")*?)+)+(?(opP)(?!))|(?:(?:(?'opBr'\{)(?>[^{}""]+|""[^""]*"")*)+(?:(?'clBr-opBr'\})(?>[^{}""]+|""[^""]*"")*?)+)+(?(opBr)(?!)))" );
string test_sample = @"if (eval (date day) == ""14"") {print ""Today is the 14th""} else {print ""It is not the 14th""}";

Match M = RxParts.Match(test_sample);
while ( M.Success )
{
    string strM = M.Value.Trim();
    if ( strM.Length > 0 )
        Console.WriteLine("{0}", strM);
    M = M.NextMatch();
}

вывод

if
(eval (date day) == "14")
{print "Today is the 14th"}
else
{print "It is not the 14th"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...