2014-02-24 19 views
6

Ich versuche, jeden nicht alpha Zeichen in einer Zeichenkette mit " " mit boost zu ersetzen:Boost-regex: [: alpha:] und akzentuierte Zeichen

std::string sanitize(std::string &str) 
{ 
    boost::regex re; 
    re.imbue(std::locale("fr_FR.UTF-8")); 
    re.assign("[^[:alpha:]]"); 
    str = boost::regex_replace(str, re, " "); 
    return str; 
} 


int main() 
{ 
    std::string test = "(ça) /.2424,@ va très bien ?"; 
    cout << sanitize(test) << endl; 
    return 0; 
} 

Das Ergebnis ist a va tr s bien aber ich möchte ça va très bien bekommen.

Was fehlt mir?

+1

Randnotiz: In PCRE würden Sie die 'u'-Flagge verwenden, um die gewünschten Ergebnisse zu erzielen. Ich habe die Boost-Bibliothek durchsucht, konnte aber nichts vielversprechendes finden. Bei einer anderen Anmerkung möchten Sie vielleicht ein Plus zu Ihrem Ausdruck '[^ [: alpha:]] +' hinzufügen, dann müssen Sie die Leerzeichen von links/rechts trimmen. [Demo] (http://regex101.com/r/cG1iM2) – HamZa

+1

Danke für den Tipp @HamZa! – Nicolas

Antwort

6

boost::regex::imbue tut nicht das, was Sie hier hoffen - insbesondere wird es boost :: regex nicht mit UTF-8 arbeiten. (Sie könnten wahrscheinlich mit ISO 8859-1 oder einer ähnlichen Einzelbyte-Zeichencodierung auf diese Weise arbeiten, aber das scheint hier nicht so zu sein).

Für UTF-8-Unterstützung müssen Sie eine der boost :: regex-Klassen verwenden, die sich mit Unicode befassen - siehe http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/boost_regex/unicode.html.

Hier ist ein Code, den ich denke, das tut, was Sie wollen:

#include <string> 
#include <boost/regex/icu.hpp> 

std::string sanitize(std::string &str) 
{ 
    boost::u32regex re = boost::make_u32regex("[^[:alpha:]]"); 
    str = boost::u32regex_replace(str, re, " "); 
    return str; 
} 


int main() 
{ 
    std::string test = "(ça) /.2424,@ va très bien ?"; 
    std::cout << test << "\n" << sanitize(test) << std::endl; 
    return 0; 
} 

http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/boost_regex/ref/non_std_strings/icu/unicode_algo.html Siehe für weitere Beispiele.

Verwandte Themen