代码之家  ›  专栏  ›  技术社区  ›  Kumar Roshan Mehta

在C++中提取字符串

  •  -3
  • Kumar Roshan Mehta  · 技术社区  · 6 年前

    我知道这样的问题会被问很多次,但是我很难从一个大字符串中提取出一个字符串。 我有一根像这样的绳子:

    GET /analysis HTTP/1.1
    
    Host: localhost:4433
    
    User-Agent: curl/7.47.0
    
    Accept: */*
    
    Authorization: Basic MTIzYWxpY2U6bWVyY3VyeQ==
    
    Content-Length: 40
    
    Content-Type: application/x-www-form-urlencoded
    
    
    
    {"u_id": 62, "g_id": 14, "a_type": "LR"}
    

    我想提取 MTIzYWxpY2U6bWVyY3VyeQ== 但是 MtizyWxpy2u6bWvy3vyeq== 除了 Authorization: Basic 肯定会在那里,我没有Boost图书馆。我也不希望在提取的字符串周围有任何空白字符。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Jack Of Blades    6 年前

    幸运的是,字符串包含实现这一点的成员函数,尽管有人可能会想出一个“更酷”的解决方案,但这是可行的(并且打算这样做):

    #include <iostream>
    #include <string>
    #include <sstream>
    
    int main(){
        std::ostringstream oss;
        oss << "GET /analysis HTTP/1.1\n\n"
            << "Host: localhost:4433\n\n"
            << "User-Agent: curl/7.47.0\n\n"
            << "Accept: */*\n\n"
            << "Authorization: Basic MTIzYWxpY2U6bWVyY3VyeQ==\n\n"
            << "Content-Length: 40\n\n"
            << "Content-Type: application/x-www-form-urlencoded\n\n"
            << "{\"u_id\": 62, \"g_id\": 14, \"a_type\": \"LR\"}";
    
        std::string content = oss.str();
    
        std::string delimiterStart = "Basic ";
        std::string delimiterEnd = " ";
    
        int start = content.find(delimiterStart) + delimiterStart.length();
        std::string partial = content.substr(start, content.length());
        partial = partial.substr(0, partial.find(delimiterEnd));
    
        std::cout<<"STR: "<< partial;
        return 0;
    }
    

    这是假设您知道两个定界符,不管是什么情况,您都需要它,否则,如果您不知道从何处到何处“获取”任何内容,您将如何提取任何内容?

        2
  •  0
  •   PeterT    6 年前

    我知道正则表达式被过度使用了,但为了子孙后代,这里有一个使用正则表达式的解决方案。

    #include <iostream>
    #include <regex>
    using namespace std;
    
    std::string source = R"(GET /analysis HTTP/1.1
    
    Host: localhost:4433
    
    User-Agent: curl/7.47.0
    
    Accept: */*
    
    Authorization: Basic MTIzYWxpY2U6bWVyY3VyeQ==
    
    Content-Length: 40
    
    Content-Type: application/x-www-form-urlencoded
    
    
    
    {"u_id": 62, "g_id": 14, "a_type": "LR"})";
    
    int main() {
        std::smatch match;
        std::regex reg(R"(Authorization:[\s]*Basic[\s]*([^\s]+))");
    
        std::regex_search(source,match,reg);
    
        if(match.size() >=2) {
            std::cout << match[1] << std::endl;
        }
        return 0;
    }