2011-01-28 4 views
4

J'ai cherché, je n'ai rien trouvé. Dans l'intérêt de ne pas perdre plus de temps sur la possibilité que la réponse soit évidente pour quelqu'un d'autre, je demande ici. Seul le site qui a été utile jusqu'à présent est celui-ci: http://softwareramblings.com/2008/07/regular-expressions-in-c.html mais les exemples sont beaucoup trop simplistes. J'utilise Visual Studio 2010.C++ Regex pour faire correspondre les mots sans ponctuation

#include <regex> 

[...] 

string seq = "Some words. And... some punctuation."; 
regex rgx("\w"); 

smatch result; 
regex_search(seq, result, rgx); 

for(size_t i=0; i<result.size(); ++i){ 
    cout << result[i] << endl; 
} 

Résultat attendu serait:

Certains
mots
Et
certains
ponctuation

Merci.

+0

Je ne vous blâme pas de ne pas avoir raison. La documentation que j'ai vu sur ce sujet souffle fort. –

Répondre

3

Quelques choses ici. D'abord, votre chaîne regex doit avoir le \ d'abord échappé. C'est toujours une chaîne C++, après tout.

regex rgx("\\w"); 

En outre, l'expression régulière \w correspond à un seul "caractère de mot". Si vous voulez faire correspondre un mot entier, vous devez utiliser:

regex rgx("\\w+"); 

Enfin, pour itérer toutes les correspondances possibles, vous devez utiliser un itérateur. Voici un exemple de travail complet:

#include <regex> 
#include <string> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    string seq = "Some words. And... some punctuation."; 
    regex rgx("\\w+"); 

    for(sregex_iterator it(seq.begin(), seq.end(), rgx), it_end; it != it_end; ++it) 
     cout << (*it)[0] << "\n"; 
} 
+0

J'ai complètement oublié de devoir encore échapper à la chaîne. L'autre réponse postée a fonctionné, le seul ajout dont j'ai besoin est d'ignorer tous les mots avec seulement des chiffres. – Chris

+0

@Chris: @Eugene m'a battu, parce que j'ai pris le temps d'expliquer plus de choses et vous donner un exemple complet de travail :) –

+0

@Chris: Plus difficile. Vous devrez utiliser une forme de lookahead, methinks. Jetez un coup d'oeil ici: http://www.regular-expressions.info/refadv.html –

1

Essayez ceci:

string seq = "Some words. And... some punctuation."; 
regex rgx("(\\w+)"); 

regex_iterator<string::iterator> it(seq.begin(), seq.end(), rgx); 
regex_iterator<string::iterator> end; 

for (; it != end; ++it) 
{ 
    cout << it->str() << endl; 
} 
+0

Cela a bien fonctionné. – Chris

Questions connexes