C # Regex для анализа json-подобного верхнего объекта - PullRequest
0 голосов
/ 13 апреля 2019

Мне нужно проанализировать json-подобный текстовый файл для извлечения таких объектов с помощью C # Regex:

foo {
    line1
    line2
}

bar {
    line3
    line4
}

т.е. объектов, которые начинаются и заканчиваются в начале строки.Тестовый код C #:

Regex regex = new Regex("\\n[^ \\n]+ \\{[.\\n]+\\n\\}");
string s = "\nfoo {\n    line1\n    line2\n}";
string v = regex.Match(s).Value;

это означает:

новая строка-> все, кроме пробела и новой строки-> "{" -> любая вещь плюс новая строка-> новаястрока ->}

Ожидаемый результат - просто s.Но результат - пустая строка.Если я удаляю "\\n\\}" в конце:

Regex regex = new Regex("\\n[^ \\n]+ \\{[.\\n]+");
string s = "\nfoo {\n    line1\n    line2\n}";
string v = regex.Match(s).Value;

, то v="\nfoo {\n"

это работает, как и ожидалось, поэтому кажется, что проблема возникает из "\\n\\}".

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

В качестве примера вы можете сопоставить первую строку, заканчивающуюся фигурной скобкой.

Затем используйте повторяющийся шаблон, чтобы соответствовать всей строке, только если он не начинается с закрывающей }.Вы можете сделать это, используя отрицательный взгляд (?!}).

Затем сопоставьте закрывающую фигурную скобку.

[\r\n]\S+\s*{[\r\n](?:(?!}).*[\r\n])*}

О шаблоне

  • [\r\n] Соответствие новой строки
  • \S+\s* Соответствие 1+ умножение на непробельный символ, затем 0+ умножение на пробел
  • {[\r\n] Открытие матча {, за которым следует новая строка
  • (?:(?!}) Отрицательный взгляд вперед, утверждая, что находится непосредственно направо не является }
  • .*[\r\n] Соответствует любому символу, кроме новой строки 0+ раз, затем соответствует новой строке
  • } Закрытие матча }

.NET regex demo | C # demo

Например:

        Regex regex = new Regex(@"^\S+\s*{[\r\n](?:(?!}).*[\r\n])*}"); 
        string s = @"foo {
    line1
    line2
}

bar {
    line3
    line4
}";

        Console.WriteLine(regex.Match(s).Value);

Результат:

foo {
    line1
    line2
}
0 голосов
/ 13 апреля 2019

Я нахожу работающее решение:

Regex r1 = new Regex("\\n[^ \\n]+ \\{[\\s\\S]+?\\n\\}");
string s = "\nfoo {\n    line1\n    line2\n}";
string v = r1.Match(s).Value;

сейчас v = "\ nfoo {\ n line1 \ n line2 \ n}"

Я новичок в регулярных выражениях, послебольше исследований, ссылка говорит, что когда вы ставите "."в «[]» точка больше не будет представлять «что-либо».Вы можете использовать «[\ s \ S]» для представления всего, включая новую строку.

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