Разобрать {"item" = "value"} с помощью Java - PullRequest
0 голосов
/ 19 октября 2018

Возможно, он существует где-то еще, но мне не удается его найти.

У меня есть файл с такими данными, как {“item1”=“value1”, “item2”=“value2”} и т. Д. Все, что мне удается сделать, чтобы получить значениебыл .split(“,”), а затем .split(“=“).После этого я просто удаляю с .replace(“\”, “”).

Так что это «работает», но не очень хорошо и эффективно, особенно если у меня есть несколько {}.

IsЕсть ли лучший способ сделать это?Или я должен сохранить свои данные другим способом?Я действительно плохо разбираюсь в хранении данных.

Большое спасибо!

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Вы понимаете, что все, что вы можете сделать, это 1 строка кода:

String array[] = line.replaceAll("[\\{\\}\"]", "").split(",");

Если я не ошибаюсь, вы сказали, что вы .split(“,“) перед вами .replace("\"", "")Если это так, то есть проблема, потому что вы должны пройти через все разделенные элементы, чтобы произвести замену.Вместо этого сначала сделайте все замены и, наконец, разбейте, чтобы получить массив пар (item=value).

0 голосов
/ 20 октября 2018

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

S → {Q}
Q → T | ɛ
T → A | A,T
A → I=V | {T}
I → item       // item is the regex for whatever you expect in the item field
V → value      // value is the regex for whatever you expect in the value field

Приведенная выше грамматика соответствует строкам следующего типа (она также поддерживает вложение фигурных скобок):

  1. {item = value}
  2. {элемент = значение, элемент = значение}
  3. {элемент = значение, элемент = значение, элемент = значение, элемент = значение}
  4. {элемент = значение, элемент =значение, элемент = значение, элемент = значение, {элемент = значение}, {элемент = значение}}
  5. {элемент = значение, элемент = значение, элемент = значение, элемент = значение, {элемент = значение,{item = value}}}

Как только вы проанализируете входной файл с этой грамматикой, используя ANTLR, вы получите дерево разбора, которое сохранит иерархию пар элемент-значение в исходном вводе.Используя эту структуру данных дерева разбора, вы можете легко получить информацию о различных парах элемент-значение.

С ANTLR ваша структура данных дерева разбора будет выглядеть примерно так:

                                         ,
                                       /   \
                                     /       \
                                   /           \
                                 /               \
                               /                   \
                             =                      ,                 ===> represents {item=value,{item=value,item=value}}                                                  
                            / \                   /   \
                           /   \                /       \
                       item   value           /           \
                                             =             =
                                            /  \          /  \
                                           /    \        /    \
                                         item  value   item   value

Даже если вы не хотите использовать для этой задачи такой инструмент, как ANTLR, вы можете легко написать синтаксический анализатор с рекурсивным спуском на основе этой грамматики, хотя вам придется токенизировать ввод файла, используя эти 6 типов токенов (изатем скормите его вашему парсеру) =>

Token class  matches
LPAREN         "{"
RPAREN         "}"
COMMA          ","
ITEM           item  //regex for identifying items
VALUE          value //regex for identifying values
EQUAL          "="
0 голосов
/ 19 октября 2018

Я могу придумать 2 способа сделать это:

  1. Сопоставить и заменить:

    Заменить символ "=" между ключом и значением на ":", чтобысделайте это файлом JSON.Затем проанализируйте его с помощью сторонних инструментов, таких как gson .Я бы предложил использовать регулярное выражение для поиска «=» между ключами и значениями, поскольку этот символ также может появляться в строковом литерале значения и / или ключа.

  2. Проверьте полноту скобок:

    Вы можете использовать стек для этого.Подробнее о реализации см. здесь .

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