Разбор этого сообщения

Так что я застрял с сообщением формы

{ Envelope={ Category1={ "key1"="value1"} Category2={ "key2"="value2", "key3"="value3"} } }

Как мне вообще разобрать эту странную структуру? Меня интересуют только пары ключ-значение. Я хочу их всех, и меня не волнуют категории. В идеале вот так:

key1 = value1
key2 = value2
key3 = value3

(с кавычками или без)

Решение на любом языке приемлемо. Инструменты Perl, Python, Java, C, C++, GNU (sed,awk...). Единственное решение, о котором я могу подумать сейчас, - это написать программу на Java/C++, но я хочу избежать этого, если есть более простые методы.

2 ответа

Решение

Через инструмент Bash grep,

$ grep -oE '"[^"]*"="[^"]*"' file
"key1"="value1"
"key2"="value2"
"key3"="value3"

От grep --help

-o, --only-matching       show only the part of a line matching PATTERN
-E, --extended-regexp     PATTERN is an extended regular expression (ERE)

Объяснение:

  • " Соответствует буквальному " условное обозначение.
  • [^"]* Соответствует любому персонажу, но не " ноль или более раз.

Решение Java

String regex = "\"(\\w+)\"=\"(\\w+)\"";

Группа 1 является ключом

Группа 2 является значением

Пример:

public static void main(String[] args) throws ParseException {
    String w = "{ Envelope={ Category1={ \"key1\"=\"value1\"} Category2={ \"key2\"=\"value2\", \"key3\"=\"value3\"} } }";
    String regex = "\"(\\w+)\"=\"(\\w+)\"";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(w);
    while (m.find()) {
        System.out.println("Key: " + m.group(1));
        System.out.println("Value: " + m.group(2));   
    }
}

Выход

Key: key1
Value: value1
Key: key2
Value: value2
Key: key3
Value: value3
Другие вопросы по тегам