J’utilise le code ci-dessous pour essayer de faire correspondre les symboles à l’aide de regex (par exemple, j’essaie de faire correspondre le symbole de l’écanvas circulaire, http://graphemica.com/%E2%9C%AA )
#include //... std::wssortingng text = L"a✪c"; auto re = L"(\\p{S}|\\p{L})+?"; boost::wregex r(re); boost::regex_token_iterator i(boost::make_regex_token_iterator(text, r, 1)), j; while (i != j) { std::wssortingng x = *i; ++i; } //...
La valeur en octets du text
est {97, 10026, 99}
, ou {{0x61,0x272A, 0x63} ‘). C’est donc un symbole valide.
Le code correspond aux 2 lettres, 'a'
0x61
et 'c'``0x63
, mais pas au symbole ( 0x272A
). Je l’ai essayé avec quelques autres symboles et aucun d’entre eux ne fonctionne (© par exemple).
Qu’est-ce que j’oublie ici?
La documentation de Boost.Regex indique explicitement que l’ utilisation de boost::wregex
n’est pas prise en charge pour les classes de caractères spécifiques à Unicode .
Si vous souhaitez cette fonctionnalité, vous devez créer Boost.Regex avec le support ICU activé, puis utiliser le type boost::u32regex
au lieu de boost::wregex
.