web-dev-qa-db-fra.com

Comment puis-je supprimer les espaces de fin d'une chaîne QString?

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.

31
Di Zou

QString a deux méthodes liées au découpage des espaces blancs:

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 "";
}
43
Frank S. Thomas

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"
27
Andrejs Cainikovs

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.

8
Bart

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.

6
Silas Parker

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;
}
3
Johan

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.

3
Martin Beckett

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;
}
1
Jason C

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 QCharisSpace() pour vérifier si un caractère est un espace.

0

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 "";
}
0
CapelliC