Рассмотрим следующее содержимое строки:
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:
Сначала я хотел найти, например, цена а затем переместить 3 символа вперед (‘:’) и собирать все до следующего ‘ — однако я не уверен, полностью ли я не в курсе или нет.
Любая помощь приветствуется.
Поскольку строка, которую вы пытаетесь проанализировать, выглядит как JSON (JavaScript Object Notation), рассмотрите возможность использования специализированных Парсер JSON.
Вы можете найти полный список анализаторов JSON на многих языках, включая C ++, по адресу http://json.org/. Кроме того, я нашел обсуждение достоинств нескольких анализаторов JSON для C ++ в ответ на это ТАК вопрос.
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;
}