2015-12-17 2 views
-1

Мне была приведена эта строка ниже. Это не то, что я могу изменить. Мне нужно создать цикл for, который проходит через эту строку и создает список подстрок, основанных на каждом «объекте». Есть ли что-то в регулярном выражении, которое позволило бы мне разбить его на желаемую цель? Я не очень хорошо разбираюсь в методах синтаксического анализа в C#. Совет будет очень благодарен. Благодаряразбор строки в подстроки C#

введённому

{ 
    [#HEADER_15618] = { 
     { 
      name = "Donuts", 
      isEnabled = true, 
      isWired = false, 
     }, 
     { 
      name = "Test", 
      isEnabled = true, 
      isWired = false, 
     }, 
    }, 
} 

требуемый выход

List<string> strings = 
{ 
    "{ 
     name = "Donuts", 
     isEnabled = true, 
     isWired = false, 
    }", 
    "{ 
     name = "Test", 
     isEnabled = true, 
     isWired = false, 
    }", 
} 

Имея в виду, что количество элементов изменить его изменить не всегда только два. И число внутри #HEADER не всегда одно и то же.

+8

Какой позор. Это чертовски близко к json –

+3

Aaaaaaaand, что вы пробовали? – TheLethalCoder

+0

Спасибо за обновление. Есть вопрос? –

ответ

1

Хорошо, это своего рода хакерское решение. Я уверен, что есть лучшие способы справиться с этим, используя Regex как таковой, я предлагаю вам добавить тег regex к вашему сообщению, чтобы получить некоторые из гуру regex здесь.

var strings = input.Split(new string[] { "= {", "}," }, StringSplitOptions.RemoveEmptyEntries) 
        .Skip(1) 
        .Select(x => x.Trim()) 
        .Where(x => x.StartsWith("{")) 
        .Select(x => x + " }") 
        .ToList(); 

Начало, разделив строку на две строки. Первый избавляется от заголовка, другой разбивает объекты вверх. Затем пропустите первый, так как это заголовок, который нам не нужен. Затем найдите все записи, начинающиеся с {, чтобы избавиться от последних нескольких записей, которые мы также не хотим. Затем мы используем еще один Select, чтобы добавить } обратно на то, что было съедено string.Split().

Опять же, это не эффективное решение, особенно если входная строка содержит много объектов, так как она создает много строк в процессе обработки ввода. Regex, вероятно, предлагает лучшее решение.

2

Возможно:

^\s*{\s*\[#.*\]\s*=\s*{\s*{(.*)}\s*,\s*{(.*)}\s*,?\s*}\s*,?\s*}\s*$ 

Regular expression visualization

Debuggex Demo

Затем возьмите 2 захваченные группы и положить '{' и '}' на концах