Je veux supprimer tous les caractères d'espacement fin dans un QString
. Je cherche à faire ce que la fonction Python fonction str.rstrip()
avec un QString
.
J'ai fait quelques recherches sur Google et j'ai trouvé ceci: http://www.qtforum.org/article/20798/how-to-strip-trailing-whitespace-from-qstring.html
Donc, ce que j'ai en ce moment, c'est quelque chose comme ceci:
while(str.endsWith( ' ' )) str.chop(1);
while(str.endsWith( '\n' )) str.chop(1);
Existe-t-il un moyen plus simple de procéder? Je veux garder tous les espaces au début.
QString
a deux méthodes liées au découpage des espaces blancs:
QString QString::trimmed() const
QString QString::simplified() const
Si vous souhaitez supprimer uniquement les espaces de fin, vous devez l'implémenter vous-même. Voici une telle implémentation qui imite l'implémentation de trimmed
:
QString rstrip(const QString& str) {
int n = str.size() - 1;
for (; n >= 0; --n) {
if (!str.at(n).isSpace()) {
return str.left(n + 1);
}
}
return "";
}
QString
ne fournit que deux fonctions liées au découpage. Dans le cas où ils ne répondent pas à vos besoins, je crains que vous n'ayez à implémenter votre propre fonction de rognage personnalisée.
QString QString::simplified () const
Renvoie une chaîne dont les espaces blancs ont été supprimés du début et de la fin, et dont chaque séquence d'espaces internes est remplacée par un seul espace.
QString str = " lots\t of\nwhitespace\r\n ";
str = str.simplified();
// str == "lots of whitespace";
QString QString::trimmed () const
Renvoie une chaîne dont les espaces sont supprimés au début et à la fin.
QString str = " lots\t of\nwhitespace\r\n ";
str = str.trimmed();
// str == "lots\t of\nwhitespace"
Si vous n'avez pas ou n'avez pas besoin d'espace blanc au début, vous pouvez utiliser QString QString::trimmed () const
.
Cela ignore tout espace blanc interne, qui est corrigé par la solution alternative fournie par Andrejs Cainikovs.
Vous pouvez le faire avec une expression rationnelle:
#include <QtCore>
int main(int argc, char** argv)
{
QCoreApplication app(argc, argv);
QString str("Hello world ");
qDebug() << str;
str.remove(QRegExp("\\s+$"));
qDebug() << str;
return 0;
}
Que ce soit plus rapide, je ne suis pas sûr.
Si vous ne voulez pas faire une copie complète de la chaîne:
QString & rtrim( QString & str ) {
while( str.size() > 0 && str.at( str.size() - 1 ).isSpace() )
str.chop( 1 );
return str;
}
QString :: Trimmed () supprime les espaces du début et de la fin - si vous êtes sûr qu'il n'y a pas d'espaces au début, vous pouvez l'utiliser.
Pas de copie complète et pas d'appels répétés à size/chop:
QString & rtrimInPlace (QString &str) {
for (int n = str.size() - 1; n >= 0; -- n)
if (!str.at(n).isSpace()) {
str.truncate(n + 1);
break;
}
return str;
}
Pour autant que je sache, les seules fonctions intégrées sont trimmed()
et simplified()
. Vous devrez donc couper manuellement. Dans ce cas, vous devez utiliser la fonction QChar
isSpace()
pour vérifier si un caractère est un espace.
Ceci est une variation de la réponse publiée par Frank S. Thomas:
QString rstrip(const QString& str, const char *skip = " \r\n\t") {
int n = str.size() - 1;
for (; n >= 0; --n) {
if (0 == strchr(skip, str.at(n).toAscii()))
return str.left(n + 1);
}
return "";
}