2017-01-15 4 views
3

je dois séparer une chaîne comme ceci:Expression régulière pour la séparation par des virgules, sauf si la virgule est, entre parenthèses,

cat, dog , ant(elephant, lion(tiger)), bird

dans ce:

cat 
dog 
ant(elephant, lion(tiger)) 
bird 

Mon état actuel est le suivant: (\w+)(,\s*)*, mais cela sépare également l'éléphant, le lion et le tigre. En outre, certaines virgules et espaces sont conservés.

Vous pourriez avoir deviné, que j'appellerai encore la même expression sur la chaîne ant(...) dans une autre itération. Si c'est important, je vais l'utiliser en C++.

+1

Cela ne ressemble pas à un langage régulier. Vous aurez besoin d'un type d'analyseur plus fort. –

+1

Peut-être équivalent à http://stackoverflow.com/q/1732348. –

+1

Je ne sais pas si regex est la solution, mais vous pouvez le faire avec une fonction d'analyse c/C++ très simple. – 16tons

Répondre

3

This regex:

(\w+\(.+\))|\w+ 

analysera

cat, dog , ant(elephant, lion(tiger)), bird 

en:

cat 
dog 
ant(elephant, lion(tiger)) 
bird 

Programme complet:

#include <string> 
#include <vector> 
#include <iterator> 
#include <regex> 
#include <iostream> 

int main() 
{ 
    std::string str{R"(cat, dog , ant(elephant, lion(tiger)), bird)"}; 
    std::regex r{R"((\w+\(.+\))|\w+)"}; 

    std::vector<std::string> result{}; 
    auto it = std::sregex_iterator(str.begin(), str.end(), r); 
    auto end = std::sregex_iterator(); 
    for(; it != end; ++it) { 
     auto match = *it; 
     result.push_back(match[0].str()); 
    } 
    std::cout << "Input string: " << str << '\n'; 
    std::cout << "Result:\n"; 
    for(auto i : result) 
     std::cout << i << '\n'; 
} 

live demo

+0

Merci de votre réponse, je la testerai demain. Quelle est la fonction du 'R' devant le' string'/'regex'? – dani

+0

@dani Il s'agit d'un [littéral de chaîne brute] (http://en.cppreference.com/w/cpp/language/string_literal) et [permet] (http://stackoverflow.com/q/19075999/ 1460794) pour écrire la chaîne regex [sans échapper] (http://en.cppreference.com/w/cpp/language/escape) toutes les barres obliques. – wally