Вопрос

Consider the following string content:

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

I have never used regex_search and I have been searching around for ways to use it - I still do not quite get it. From that random string (it's from an API) how could I grab two things:

1) the price - in this example it is 47.1000

2) the name - in this example Fantastic gloves

From what I have read, regex_search would be the best approach here. I plan on using the price as an integer value, I will use regex_replace in order to remove the "." from the string before converting it. I have only used regex_replace and I found it easy to work with, I don't know why I am struggling so much with regex_search.

Keynotes:

  1. Content is contained inside ' '
  2. Content id and value is separated by :
  3. Conent/value are separated by ,
  4. Value of id's name and price will vary.

My first though was to locate for instance price and then move 3 characters ahead (':') and gather everything until the next ' - however I am not sure if I am completely off-track here or not.

Any help is appreciated.

Это было полезно?

Решение 2

As the string you are attempting to parse appears to be JSON (JavaScript Object Notation), consider using a specialized JSON parser.

You can find a comprehensive list of JSON parsers in many languages including C++ at http://json.org/. Also, I found a discussion on the merits of several JSON parsers for C++ in response to this SO question.

Другие советы

boost::regex would not be needed. Regular expressions are used for more general pattern matching, whereas your example is very specific. One way to handle your problem is to break the string up into individual tokens. Here is an example using boost::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;
}

Link to live code.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top