Разбиение строки на несколько групп строк

#javascript #split

#javascript #разделение

Вопрос:

У меня есть строка, которая содержит список элементов, некоторые из которых являются фиксированными, а некоторые из которых можно выбрать. В качестве примера предположим, что моя строка представляет собой список покупок:

 "strawberry, raspberry, $2{tomato, sauerkraut, beans},
 potato, $1{{apple, pear}, {orange, banana}}"
  

И я хотел бы в итоге получить что-то вроде:

 ["strawberry",
 "raspberry",
 [2, "tomato", "sauerkraut", "beans"],
 "potato",
 [1, ["apple", "pear"], ["orange", "banana"]]
  

Я понятия не имею, как я могу справиться с несколькими вариантами здесь, поэтому я открыт для любых предложений. Также вы можете изменить «синтаксис» (например, "$[num of coices]{list}" ) и добавить / удалить fluff, на самом деле это не имеет значения. Чем проще, тем веселее! :]

редактировать: у меня есть миллионы таких списков в приведенном выше формате, и преобразование их вручную не является вариантом, если только нет другого решения … : (

Спасибо!

Комментарии:

1. Было бы неплохо привести реальный пример и показать, для чего он используется и откуда берется строка

2. Это для автоматизации генерации персонажей для игры, где игроки могут выбирать (например), поступать ли им в военную школу или гражданскую академию. В зависимости от того, какой путь они выбрали (и некоторых других вещей), существует ряд возможных результатов, каждый из которых предусматривает фиксированное вознаграждение и набор типов «выбери X из». На данный момент эти вознаграждения в значительной степени хранятся в одной строке. Я надеюсь, что их можно как-то разделить, потому что их переработка — это большая проблема.

Ответ №1:

Почему вы не используете JSON для этого?

 var list = ["strawberry",
     "raspberry",
     [2, "tomato", "sauerkraut", "beans"],
     "potato",
     [1, ["apple", "pear"], ["orange", "banana"]]];

var str = JSON.stringify(list);
/*
str = '["strawberry","raspberry",[2,"tomato","sauerkraut","beans"],"potato",[1,["apple","pear"],["orange","banana"]]]'
*/

var list2 = JSON.parse(str);
/*
list2 = ["strawberry",
         "raspberry",
         [2,"tomato","sauerkraut","beans"],
         "potato",
         [1, ["apple","pear"], ["orange","banana"]]]
*/
  

Комментарии:

1. Также возможно с помощью jQuery $.parseJSON тестовый пример

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

3. @Kenny: в вашем вопросе сказано «Также вы можете изменить «синтаксис»», а JSON — это стандартный формат сериализованных объектов JavaScript.

4. @Kenny: откуда вообще взялись эти «тысячи списков»?

5. Мой друг начал создавать эту штуковину и потратил целую вечность на ее ввод. Именно в таком формате. Я взял управление на себя, подумав: «О, для этого нужно всего несколько сотен строк скрипта».. Да, конечно. :]]]

Ответ №2:

Во-первых: я настоятельно рекомендую использовать решение на основе JSON, о котором упоминал Мэтт. Но по какой-то причине вы не можете адаптировать свой текущий код для этого, тогда попробуйте это: Примечание: я не тестировал его для разных тестовых случаев, но я думаю, что это даст вам идею…

   var testString = "strawberry, raspberry, $2{tomato, sauerkraut, beans},  potato, $1{{apple, pear}, {orange, banana}}";
    testString = testString.replace(/$(d ){/g, "{$1,");
    testString = testString.replace(/{/g, "[").replace(/}/g, "]");
    testString = testString.replace(/b/g,'"')
    testString = testString.replace(/(")([)/g,'$2$1')
    testString = testString.replace(/(])(")/g,'$2$1')
    testString = '['   testString   ']';
    var obj = JSON.parse(testString);
    for(var o in obj)
    {
        alert(typeof obj[o]);
    }
  

Рабочий пример: http://jsfiddle.net/PcMhw/4 /

Комментарии:

1. Спасибо! Это именно то, что мне было нужно, работает как шарм! Вы, уважаемый сэр (или леди), просто изумительны.

2. На мой взгляд, выглядит неплохо. Я бы взял этот код и использовал его для преобразования данных в JSON как можно скорее .

3. @Kenny: Но имейте в виду, что данные в строке могут легко нарушить приведенный выше код. Как пробел в strwawberry (клубничная ягода). Конечно, вы можете улучшить код, чтобы он мог обрабатывать эти сценарии, но это становится более сложным по мере определения большего количества тестовых случаев. Вот почему даже я склоняюсь к решению на основе JSON. Просто хочу убедиться, что вы понимаете риск.

4. Поскольку это только для хобби, я на самом деле не беспокоюсь о том, что что-то сломаю. :] Вероятно, я сделаю то, что предлагает Мэтт, и использую это в первую очередь для преобразования всего материала в JSON. Еще раз спасибо!