Java - извлечение JSON значений из строки с использованием нескольких регулярных выражений - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь использовать это мульти-регулярное выражение java библиотека для извлечения JSON значения поля из строки.

My JSON выглядит так:

{
  "field1": "something",
  "field2": 13
  "field3": "some"
}

Я создал шаблон регулярного выражения для каждого поля, и он работает с Java Шаблон регулярного выражения, просто делая что-то подобное для каждого шаблона:

Matcher matcher = patternToSearch.matcher(receiveData);
        if (matcher.find()) {
            return matcher.group(1);
        }

Я решил попробовать и улучшить код и использовать многократное регулярное выражение, поэтому вместо сканирования строки 3 раза он будет сканировать ее только один раз и извлекать все необходимые значения.

Итак, я придумал что-то вроде этого:

String[] patterns = new String[]{
                    "\"field1\":\\s*\"(.*?)\"",
                    "\"field2\":\\s*(\\d+)(\\.\\d)?",
                    "\"field3\":\\s*\"(.*?)\"",
            };
            this.matcher = MultiPattern.of(patterns).matcher();

у matcher есть только один метод - match - используемый следующим образом:

int[] match = this.matcher.match(jsonStringToScan);

, поэтому я получил список целых чисел, но понятия не имею, как получить json значения из этих строк и как эти целые числа помогают мне. Multi regex matcher не поддерживает метод group, который я использовал ранее для получения значения.

Есть идеи, как извлечь несколько значений json из строки, используя multi regex? (Сканирование строки только один раз)

1 Ответ

0 голосов
/ 01 апреля 2020

Как уже упоминалось на странице github по вашей ссылке match возвращает индексы совпавших шаблонов. Еще один момент на этой странице:

Библиотека не обрабатывает группы.

Рассмотрите возможность сопоставления ключа как группы. Посмотрите на этот простой пример:

    final Pattern p = Pattern.compile("\"(field.)\":((?:\".*?\")|(?:\\d+(?:\\.\\d+)?))");
    final Matcher m = p.matcher("{\"field3\":\"hi\",\"field2\":100.0,\"field1\":\"hi\"}");
    while (m.find()) {
        for (int i = 1; i <= m.groupCount(); i++) {
            System.out.print(m.group(i) + " ");
        }
        System.out.println();
    }

Он печатает:

field3 "hi" 
field2 100.0 
field1 "hi" 

Если вы хотите избежать кавычек в группе значений, вам нужны более сложные логики c. Я остановился на:

        final Pattern p = Pattern.compile("\"(field.)\":(?:(?:\"(.*?(?=\"))\")|(\\d+(?:\\.\\d+)?))");

, в результате чего

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