2012-08-08 5 views
1

Je veux analyser l'information du processeur sous Linux. J'ai écrit un tel code:Expressions régulières en C++ 11

// Returns full data of the file in a string 
std::string filedata = readFile("/proc/cpuinfo"); 

std::cmath results; 
// In file that string looks like: 'model name : Intel ...' 
std::regex reg("model name: *"); 
std::regex_search(filedata.c_str(), results, reg); 

std::cout << results[0] << " " << results[1] << std::endl; 

Mais il renvoie une chaîne vide. Qu'est-ce qui ne va pas?

+0

Vous ne voulez pas dire 'cmatch'? Pouvez-vous s'il vous plaît poster tout le code et le contenu de 'cpuinfo'? – slaphappy

+0

Voir ce sujet "Différence entre regex_match et regex_search?" (http://stackoverflow.com/questions/11628047/difference-between-regex-match-and-regex-search) – SChepurin

+0

Vous voulez ajouter que cela fonctionne dans VC++ 2010 avec une expression corrigée par James Kanze dans la réponse ci-dessous. – SChepurin

Répondre

3

Vous n'avez spécifié aucune capture dans votre expression.

Compte tenu de la structure de /proc/cpuinfo, je serais probablement préfère une ligne les entrées, en utilisant std::getline, plutôt que d'essayer de le faire tout à la fois. Donc, vous finirez avec quelque chose comme:

std::string line; 
while (std::getline(input, line)) { 
    static std::regex const procInfo("model name\\s*: (.*)"); 
    std::cmatch results; 
    if (std::regex_match(line, results, procInfo)) { 
     std::cout << "???" << " " << results[1] << std::endl; 
    } 
} 

Ce n'est pas clair pour moi ce que vous vouliez en sortie. Probablement, vous devez également capturer la ligne processor et afficher le début de la ligne d'information du processeur au .

Les choses importantes sont à noter:

  1. Vous devez accepter des quantités variables d'espace blanc: utiliser "\\s*" 0 ou plus, "\\s+" pour un ou plusieurs espaces.

  2. Vous devez utiliser des parenthèses pour délimiter ce que vous voulez capturer.

(FWIW: Je fonde en fait mes déclarations sur boost::regex, puisque je ne ai pas accès à std::regex Je pense qu'ils sont assez similaires, cependant, et que mes déclarations à appliquer au-dessus. les deux.)

+0

Belle réponse, merci;). Btw, remplacez, s'il vous plaît 'line' avec' line.c_str() 'dans' regex_match'. – Ockonal

+0

@Ockonal Pourquoi le changement? Les deux sont définis dans la norme (et tous deux fonctionnent avec boost :: regex). –

+0

Dans mon 4.7.1 gcc il y avait une erreur liée à ceci – Ockonal

5

Tous les compilateurs ne prennent pas encore en charge la spécification C++ 11 complète. Notamment, regex_search ne fonctionne pas dans GCC (à partir de la version 4.7.1), mais dans VC++ 2010.

+1

voir aussi: http://gcc.gnu.org/onlinedocs/gcc-4.7.1/libstdc++/manual/manual/status.html#status.iso.2011 – moooeeeep

2

Essayez std::regex reg("model_name *: *"). Dans mon cpuinfo il y a des espaces avant le deux-points.

+0

Sans capture, il n'obtiendra toujours pas l'information qu'il Besoins. –