Парсинг строки в виде неориентированного множества
Необходимо разбить строку(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;
}