C ++ boost / regex regex_search

Рассмотрим следующее содержимое строки:

string content = "{'name':'Fantastic gloves','description':'Theese gloves will fit any time period.','current':{'trend':'high','price':'47.1000'}";

Я никогда не использовал regex_search, и я искал способы его использования — я до сих пор не совсем понял. Из этой случайной строки (это из API), как я могу получить две вещи:

1) цена — в этом примере это 47,1000

2) имя — в этом примере Фантастические перчатки

Из того, что я прочитал, regex_search будет лучшим подходом здесь. Я планирую использовать цену в качестве целочисленного значения, я буду использовать regex_replace, чтобы удалить «.«из строки перед преобразованием. Я использовал только regex_replace, и мне было легко с ним работать, я не знаю, почему я так сильно борюсь с regex_search.

Keynotes:

  1. Содержимое содержится внутри »
  2. Идентификатор и значение контента разделяются :
  3. Содержание / значение разделены ,
  4. Значение идентификатора название а также цена будет меняться.

Сначала я хотел найти, например, цена а затем переместить 3 символа вперед (‘:’) и собирать все до следующего — однако я не уверен, полностью ли я не в курсе или нет.

Любая помощь приветствуется.

0

Решение

Поскольку строка, которую вы пытаетесь проанализировать, выглядит как JSON (JavaScript Object Notation), рассмотрите возможность использования специализированных Парсер JSON.

Вы можете найти полный список анализаторов JSON на многих языках, включая C ++, по адресу http://json.org/. Кроме того, я нашел обсуждение достоинств нескольких анализаторов JSON для C ++ в ответ на это ТАК вопрос.

0

Другие решения

boost::regex не будет необходимости. Регулярные выражения используются для более общего сопоставления с образцом, тогда как ваш пример очень специфичен. Один из способов решить вашу проблему — разбить строку на отдельные токены. Вот пример использования повышение :: Tokenizer:

#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>
#include <map>
int main()
{
std::map<std::string, std::string> m;
std::string content = "{'name':'Fantastic gloves','description':'Theese gloves will fit any time period.','current':{'trend':'high','price':'47.1000'}";
boost::char_separator<char> sep("{},':");
boost::tokenizer<boost::char_separator<char>> tokenizer(content, sep);
std::string id;
for (auto tok = tokenizer.begin(); tok != tokenizer.end(); ++tok)
{
// Since "current" is a special case I added code to handle that
if (*tok != "current")
{
id = *tok++;
m[id] = *tok;
}
else
{
id = *++tok;
m[id] = *++tok; // trend
id = *++tok;
m[id] = *++tok; // price
}
}

std::cout << "Name: " << m["name"] << std::endl;
std::cout << "Price: " << m["price"] << std::endl;
}

Ссылка на живой код.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector