Парсинг строки в виде неориентированного множества

Необходимо разбить строку(std::string) на элементы множества. Как пример, для множества {a, b, c} разложением на элементы будет a, b, c. А для множества {{a}, {b}, {c}} - {a}, {b}, {c}. Кроме того, {{a, b, c}, d} в результате разбиения даст {a, b, c}, d. Идей, как написать для этого регулярное выражение у меня нет.


Ответы (1 шт):

Автор решения: Harry

Ну вот, нечто на коленке бегом набросанное. Нужную обработку пробелов и защиту от дурака (от {a{b}}}{ :)) напишите сами, а равно и переделку для своего контейнера...

string getElement(const char* &c)
{
    string t;
    while(*c &&(*c == ' ' || *c == ',' || *c == '}')) ++c;
    if (*c == 0) return "";
    if (*c == '{')
    {
        int cnt = 0;
        do {
            t += *c;
            if (*c == '{') cnt++;
            if (*c == '}') cnt--;
            c++;
        } while(cnt);
    }
    else
    {
        while(*c != ',' && *c != '}' )
        {
            if (*c != ' ') t += *c;
            c++;
        }
    }
    return t;
}

vector<string> parse(const string& s)
{
    vector<string> v;
    const char * c = s.data();
    for(;*c && *c != '{'; ++c);
    if (*c++ == 0) return v;
    string t;

    while((t = getElement(c)).size())
        v.push_back(t);
    return v;
}

int main(int argc, char * argv[])
{
    for(auto s: parse("{ a, b, c }"      )) cout << "[" << s << "]"; cout << endl;
    for(auto s: parse("{ {a}, {b}, {c} }")) cout << "[" << s << "]"; cout << endl;
    for(auto s: parse("{ {a, b} , c }"   )) cout << "[" << s << "]"; cout << endl;
    for(auto s: parse("{ {a, {b}} , c }" )) cout << "[" << s << "]"; cout << endl;
}
→ Ссылка