Как найти элементы в строке в C ++ - PullRequest
0 голосов
/ 02 апреля 2020

Для URL Google, напр. https://www.google.com/search?q=some+query&oq=some+query&aqs=chrome..69i57j0l5.2991j0j9&sourceid=chrome&ie=UTF-8

Мне нужно получить поисковую систему (google.com). Любые запросы (некоторые, запрос) и все параметры (oq, aqs, sourceid и ie)

Я предполагаю, что мне нужно найти символы между двумя обратными слешами для поисковой системы. Но как мне найти каждый запрос, когда их может быть бесконечное количество, и я не могу определить звезду и конец в строке для поиска? То же самое касается опций.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 02 апреля 2020

Давайте использовать пример, который вы дали: https://www.google.com/search?q=some+query&oq=some+query&aqs=chrome..69i57j0l5.2991j0j9&sourceid=chrome&ie=UTF-8

Общая идея здесь - разделить строку на основе определенных разделителей. В этом случае различные разделы фактического URL-адреса разделяются на основе «/». Если мы разделим строку на основе этого, мы получим это:

  • https:
  • www.google.com
  • search? Q = some + query & oq = some + query & aqs = chrome .. 69i57j0l5.2991j0j9 & sourceid = chrome & ie = UTF-8

Третий раздел можно разделить далее на основе "&", чтобы получить:

  • поиск? q = some + query
  • oq = some + query
  • aqs = chrome .. 69i57j0l5.2991j0j9
  • sourceid = chrome
  • т.е. = UTF-8

Затем вы можете разделить каждый из них на "=", чтобы получить имя опции и выбранное значение. Например, «sourceid = chrome» будет разделен, чтобы дать имя опции «sourceid» и значение «chrome».

Реализовано в реальном коде C ++ это выглядит так:

// Includes
#include <iostream>
#include <vector>

// For simplicity's sake, we'll call std::vector<std::string> "Tokens"
using Tokens = std::vector<std::string>;

// Create a function to return an std::vector<std::string>
Tokens getTokens(std::string inputString, std::string delimiter)
{
    // Create a list of tokens
    Tokens tokens;

    // Create a string to store the curernt token
    std::string token;

    // Iterate through until there are no more delimiters (at which our token will be identical to our input string)
    while (token != inputString)
    {
        // Set the token to the section of the input string from its beginning to where the first delimiter is found
        token = inputString.substr(0, inputString.find(delimiter));

        // If that token isn't empty append it to the list of tokens (we could get any empty token if two delimiters follow one another, e.g. //)
        if (token != "")
        {
            tokens.push_back(token);
        }

        // Remove the token from the original input string
        inputString = inputString.substr(inputString.find(delimiter) + 1);
    }

    return tokens;
}

int main()
{
    // This is our URL:
    std::string URL = "https://www.google.com/search?q=some+query&oq=some+query&aqs=chrome..69i57j0l5.2991j0j9&sourceid=chrome&ie=UTF-8";

    // Split up the URL into tokens based on the delimiter "/"
    Tokens URL_tokens = getTokens(URL, "/"); // <--- should contain three tokens, "https:", "www.google.com" and everything after that

    // Split up the third token of the URL tokens based on the delimiter "&"
    Tokens details_tokens = getTokens(URL_tokens[2], "&");

    // Print out the tokens
    std::cout << URL_tokens[0] << "\n";
    std::cout << URL_tokens[1] << "\n\n";

    for (int token = 0; token < details_tokens.size(); token++)
    {
        // Split into option and value
        Tokens option_and_value = getTokens(details_tokens[token], "=");

        std::cout << "Option: " << option_and_value[0] << "\n";
        std::cout << "Value: " << option_and_value[1] << "\n\n";
    }
}

На моем компьютере это выдает следующий вывод:

https:
www.google.com

Option: search?q
Value: some+query

Option: oq
Value: some+query

Option: aqs
Value: chrome..69i57j0l5.2991j0j9

Option: sourceid
Value: chrome

Option: ie
Value: UTF-8
...