2012-09-18 2 views
0

Planification du développement d'un utilitaire en utilisant boost et regex pour extraire des paires de valeurs clés dans une chaîne.Boost Regex pour l'extraction de paires de valeurs clés

chaîne d'entrée de l'échantillon pourrait être le suivant

Voyage: 1,5, assurance automobile: 3,25

Après extraction devrait ressembler à

Voyage 1,5

assurance automobile 3,25

Demandez le code suivant, mais en quelque sorte cela semble être ne fonctionne pas comme prévu

std::map<std::string, std::string> pairs; 
    boost::regex re("(?:(.*?):(.*?),)*(?:(.*?):(.*?))$"); // key - value pair 

    // read lines from stdin; populate map 
    boost::sregex_iterator it(str.begin(), str.end(), re), end; 
    for (; it != end; ++it){ 
     pairs[(*it)[1]] = (*it)[2]; 
    } 
+1

Pourquoi ne pas simplement divisé par ',' ', puis par:'? Sinon, une simple regex telle que '([^:] +): ([^,] +)' suffira, où la première référence arrière est votre clé et la seconde votre valeur. –

+0

merci lindrain, a essayé ([^:] +): ([^,] +) alors nous obtenons des résultats comme 'travel 1.5' et ', assurance automobile 3.25' excepté la première clé toutes les autres touches ont ',' dans eux – Shashi

+0

a essayé de rectifier le problème en utilisant regex "(?: ([^:] +): ([^,] +) [,])", Mais maintenant toutes les paires valeur/clé sont extraites comme prévu pas de fin avec un ',' délimiteur – Shashi

Répondre

0

Cela ne devrait vraiment pas être difficile. Vous avez déjà la plupart de la réponse, c'est juste une question de manipulation de la dernière virgule. (:,|$) devrait fonctionner très bien.

(?:([^:]+):([^,]+)(?:,|$))+

Questions connexes