How do I remove trailing whitespace from a QString?

£可爱£侵袭症+ 提交于 2019-12-03 19:42:39

问题


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.


回答1:


QString has two methods related to trimming whitespace:

  • QString QString::trimmed() const
    Returns a string that has whitespace removed from the start and the end.
  • 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.

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



回答2:


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"



回答3:


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.




回答4:


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.




回答5:


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.




回答6:


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



回答7:


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



回答8:


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



回答9:


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.



来源:https://stackoverflow.com/questions/8215303/how-do-i-remove-trailing-whitespace-from-a-qstring

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!