0

考虑以下字符串内容:

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 上苦苦挣扎。

主题演讲:

  1. 内容包含在“”中
  2. 内容 id 和值由以下分隔
  3. 内容/值由,分隔
  4. id 的名称价格的值会有所不同。

我的第一个想法是找到价格,然后向前移动 3 个字符(':')并收集所有内容,直到下一个' - 但是我不确定我是否完全偏离了轨道。

任何帮助表示赞赏。

4

2 回答 2

1

boost::regex不需要。正则表达式用于更一般的模式匹配,而您的示例非常具体。处理您的问题的一种方法是将字符串分解为单独的标记。这是使用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;
}

链接到实时代码

于 2013-05-22T23:14:57.733 回答
0

由于您尝试解析的字符串似乎是JSON (JavaScript 对象表示法),请考虑使用专门的JSON 解析器

您可以在http://json.org/找到包括 C++ 在内的多种语言的 JSON 解析器的完整列表。此外,我发现了一个关于 C++ 的几个 JSON 解析器的优点的讨论,以响应这个SO question

于 2013-05-23T00:36:44.480 回答