Найти строки в кавычках первого уровня, игнорируя вложенные в них кавычки - C#

Узнай цену своей работы

Формулировка задачи:

Есть вот такая строка:

""дата "о дате"""""R'0'T'A'0'1'1'3'2"R'1'S'string here'"3"R'2'S'boxed string'"4"R'3'0'1'1"R'1'"2"R'2'"3"R'4'C'4'0'4'"R'2'""R'5'S'text value 2'""R'6'S'text value 3'""R'6'""4"R'7'C'3'0"R'8'S'list prop'"1'4'"R'9'S'text value 1'""R'5'""R'9'""5"R'10'0'1'1"R'1'"2"R'2'"""""

Очень страшная и некрасивая, мне необходимо поделить ее на части:

""дата "о дате""""

"R'0'T'A'0'1'1'3'2"R'1'S'string here'"3"R'2'S'boxed string'"4"R'3'0'1'1"R'1'"2"R'2'"3"R'4'C'4'0'4'"R'2'""R'5'S'text value 2'""R'6'S'text value 3'""R'6'""4"R'7'C'3'0"R'8'S'list prop'"1'4'"R'9'S'text value 1'""R'5'""R'9'""5"R'10'0'1'1"R'1'"2"R'2'"""""

Данные постоянно меняются, они не статичны. Пробoвал такие варианты: @"(^"").*("")" @"(?![""]).*(?< ![""])" @"(^""[^""""]*"")(""""$)" @"^""([^""]*("")*(\\[^""])*)*"""

Решение задачи: «Найти строки в кавычках первого уровня, игнорируя вложенные в них кавычки»

textual
Листинг программы
      public static string[] Split(string str)
      {
         string partPattern = @"[A-Z0-9]+(')(?:''|[^'])*'";
         string bodyPattern = @"[A-Z0-9]+("")|""";
 
         int g = 0, n = 0;
         var parts = Regex.Matches(str, partPattern).Cast<Match>().ToArray();
         return Regex.Matches(str, bodyPattern).Cast<Match>()
            .Where(x => !parts.Any(y =>
            {
               return x.Index >= y.Index &&
               x.Index + x.Length <= y.Index + y.Length;
            }))
            .Concat(parts)
            .OrderBy(x => x.Index)
            .GroupBy(x =>
            {
               string s = x.Groups[1].Value;
               if(n == 0 && (s == "'" || s == "\"")) g++;
               if(s == "\"") n++;
               if(x.Value == "\"") n--;
               return g;
            })
            .Select(x =>
            {
               Match m1 = x.First();
               Match m2 = x.Last();
               return m1 == m2
               ? str.Substring(m1.Index, m1.Length)
               : str.Substring(m1.Index, m2.Index - m1.Index + m2.Length);
            })
            .ToArray();
      }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы