40

I want to remove all the trailing whitespace characters in a QString. I am looking to do what the Python function str.rstrip() with a QString.

I did some Googling, and found this: http://www.qtforum.org/article/20798/how-to-strip-trailing-whitespace-from-qstring.html

So what I have right now is something like this:

while(str.endsWith( ' ' )) str.chop(1);
while(str.endsWith( '\n' )) str.chop(1);

Is there a simpler way to do this? I want to keep all the whitespace at the beginning.

BartoszKP
  • 34,786
  • 15
  • 102
  • 130
Di Zou
  • 4,469
  • 13
  • 59
  • 88

10 Answers10

63

QString has two methods related to trimming whitespace:

If you want to remove only trailing whitespace, you need to implement that yourself. Here is such an implementation which mimics the implementation of 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 "";
}
Frank S. Thomas
  • 4,725
  • 2
  • 28
  • 47
30

QString provides only two trimming-related functions. In case if they don't suit your needs, I'm afraid you need to implement your own custom trimming function.

QString QString::simplified () const
Returns a string that has whitespace removed from the start and the end, and that has each sequence of internal whitespace replaced with a single space.

QString str = "  lots\t of\nwhitespace\r\n ";
str = str.simplified();
// str == "lots of whitespace";

QString QString::trimmed () const
Returns a string that has whitespace removed from the start and the end.

QString str = "  lots\t of\nwhitespace\r\n ";
str = str.trimmed();
// str == "lots\t of\nwhitespace"
Andrejs Cainikovs
  • 27,428
  • 2
  • 75
  • 95
  • simplified also combines multiple whitespace INSIDE the string – Martin Beckett Nov 21 '11 at 16:51
  • Yes. Originally I've posted `simplified` and not `trimmed` because author mentions removing `\n`'s as well. But anyway, I've updated my answer. Thanks. – Andrejs Cainikovs Nov 21 '11 at 16:54
  • There is whitespace at the beginning, and I want to keep that whitespace. I also want to keep the whitespace in the middle. I guess I'll have to write my own trimming function. Thanks! – Di Zou Nov 21 '11 at 17:33
  • In this case I would go with regex'es - easy and elegant. Have a look at *skyhisi* answer. – Andrejs Cainikovs Nov 21 '11 at 17:47
9

If you don't have or don't need any whitespace at the beginning either, you could use QString QString::trimmed () const.

This ignores any internal whitespace, which is corrected by the alternative solution provided by Andrejs Cainikovs.

Bart
  • 19,692
  • 7
  • 68
  • 77
8

You can do it with a regexp:

#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;
}

Whether this would be faster, I'm not sure.

Silas Parker
  • 8,017
  • 1
  • 28
  • 43
  • 1
    Simple string operations like indexOf(), left(), strstr() and etc. always faster than regular expressions IMHO. – bartolo-otrit Sep 18 '12 at 13:54
  • It's not an opinion, it's a fact. For a mundane thing like stripping whitespace, using Regex is relatively very complex (but you may sometimes *need* regex of course, for complex situations). – csl Nov 07 '16 at 09:49
4

If you don't want to make a deep copy of the string:

QString & rtrim( QString & str ) {
  while( str.size() > 0 && str.at( str.size() - 1 ).isSpace() )
    str.chop( 1 );
  return str;
}
Johan
  • 41
  • 1
3

QString::Trimmed() removes whitespace from the start and the end - if you are sure there is no whitespace at the start you can use this.

Martin Beckett
  • 94,801
  • 28
  • 188
  • 263
2

No deep copy and no repeated calls to 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;
}
Jason C
  • 38,729
  • 14
  • 126
  • 182
0

You can add a non-space char to the begin of the string, trim it, then remove the char

str1=QString("-"+str).trimmed().mid(1);
Roy Qu
  • 31
  • 4
0

As far as I know, the only built-in-functions are trimmed() and simplified(). So you will need to trim manually. In that case you should use the QChar function isSpace() to check if a character is a space character.

AAEM
  • 1,837
  • 2
  • 18
  • 26
Sebastian Negraszus
  • 11,915
  • 7
  • 43
  • 70
0

This is a variation of the answer posted by 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 "";
}
CapelliC
  • 59,646
  • 5
  • 47
  • 90