Remplacement des éléments dans un QString basé sur un prédicat
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.
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.