Question

J'ai besoin de remplacer les caractères dans un QString en fonction de leurQChar::category. En termes stdlib, je veux

string.erase(std::remove_if(begin(string), end(string), 
                            [](QChar c) { 
                            QChar::Category cat = c.category(); 
                            return cat == .... || cat == ...; }), 
             string.end());

Alternativement, je suis satisfait d'un regexp qui fonctionne sur les catégories de caractères Unicode que je peux utiliser pour QString::replace.

Est-ce possible avec QString ou ai-je vraiment besoin de tourner la chaîne dans un std::vector<QChar> et de retour?

Edit: les catégories que je veux donjon:

  • Pour le premier Charater: $, _ ou tout caractère dans les catégories Unicode «Lettre de maîtrise (LU)», «Lettre en deux (LL)», «Lettre de titlecase (LT)», «Lettre de modificateur (LM)», «Autre Lettre (LO) "ou" Numéro de lettre (NL) "
  • Pour le reste: la première balle plus tous les caractères non-joiner U + 200C de largeur zéro, les caractères de la menuiserie U + 200D à largeur zéro, et les caractères des catégories Unicode «Mark non espacement (MN)», «Espacement combinant Mark (MC) »,« Numéro de chiffre décimal (ND) », ou« Punctuation du connecteur (PC) ».

Je peux faire d'abord / me reposer en plusieurs passes.

Était-ce utile?

La solution

QT fournit ses propres façons de faire de telles choses. Que ce soit bon ou non, il est douteux, mais QT idiomatique serait

QString result;
result.reserve(string.size());
foreach (const QChar& c, string) {
    if (is_good(c)) {
        result += c;
    }
}

Bien sûr, vous pouvez le faire avec les lambdas et std::for_each

std::for_each(string.begin(), string.end(),
                  [&result](QChar c)
                    {
                        if (is_good(c)) {result += c; }
                    }
    );

mais ce n'est pas Qt idiomatique.

Remarquez que la suppression des symboles d'une chaîne est plus lente, puis ajoutant neuf, si l'espace était réservé, c'est pourquoi le premier échantillon de code est rapide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top