How to convert string with brackets into a nested vector in C++

1 Answer

0 votes
#include <iostream>
#include <vector>
#include <string>
#include <cctype>

// Trim spaces
std::string trim(const std::string& s) {
    size_t start = 0;
    while (start < s.size() && std::isspace((unsigned char)s[start])) start++;

    size_t end = s.size();
    while (end > start && std::isspace((unsigned char)s[end - 1])) end--;

    return s.substr(start, end - start);
}

// ------------------------------------------------------------
// Parse using custom bracket characters
// Example: parseBracketArray(text, '[', ']');
// ------------------------------------------------------------
std::vector<std::vector<std::string>> parseBracketArray(
        const std::string& input,
        char openBracket,
        char closeBracket) 
{
    std::vector<std::vector<std::string>> result;
    std::vector<std::string> group;
    std::string token;

    bool inside = false;

    for (char ch : input) {
        if (ch == openBracket) {
            if (!inside) {
                inside = true;
                group.clear();
                token.clear();
            }
        }
        else if (ch == closeBracket) {
            if (!token.empty()) {
                group.push_back(trim(token));
                token.clear();
            }
            if (inside) {
                result.push_back(group);
                group.clear();
                inside = false;
            }
        }
        else if (ch == ',') {
            if (inside) {
                if (!token.empty()) {
                    group.push_back(trim(token));
                    token.clear();
                }
            }
        }
        else {
            token.push_back(ch);
        }
    }

    return result;
}

// ------------------------------------------------------------
// Print function
// ------------------------------------------------------------
void printBracketArray(const std::vector<std::vector<std::string>>& arr) {
    for (const auto& group : arr) {
        std::cout << "[";
        for (size_t i = 0; i < group.size(); i++) {
            std::cout << "'" << group[i] << "'";
            if (i + 1 < group.size()) std::cout << ",";
        }
        std::cout << "]\n";
    }
}

int main() {
    std::string str = "[[aa, bbbb], [ccc, dddd, eeeeee], [ffffff]]";

    auto parsed = parseBracketArray(str, '[', ']');

    printBracketArray(parsed);
}



/*
run:

['aa','bbbb']
['ccc','dddd','eeeeee']
['ffffff']

*/

 



answered 3 hours ago by avibootz
...