Как мне удалить конечные пробелы из QString? - PullRequest
31 голосов
/ 21 ноября 2011

Я хочу удалить все завершающие пробельные символы в QString. Я хочу сделать то, что функция Python str.rstrip() с QString.

Я немного погуглил и нашел это: http://www.qtforum.org/article/20798/how-to-strip-trailing-whitespace-from-qstring.html

Итак, у меня сейчас что-то вроде этого:

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

Есть ли более простой способ сделать это? Я хочу сохранить все пробелы в начале.

Ответы [ 9 ]

42 голосов
/ 21 ноября 2011

QString имеет два метода, связанных с обрезкой пробелов:

  • QString QString::trimmed() const
    Возвращает строку с удаленными пробелами в начале и конце.
  • QString QString::simplified() const
    Возвращает строку с удаленными пробелами в начале и конце, в которой каждая последовательность внутренних пробелов заменяется одним пробелом.

Если вы хотите удалить только конечные пробелы, вам нужно реализовать это самостоятельно. Вот такая реализация, которая имитирует реализацию 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 "";
}
27 голосов
/ 21 ноября 2011

QString обеспечивает только две функции, связанные с обрезкой. В случае, если они не соответствуют вашим потребностям, я боюсь, что вам нужно реализовать собственную функцию обрезки.

QString QString::simplified () const
Возвращает строку с удаленными пробелами в начале и конце, в которой каждая последовательность внутренних пробелов заменяется одним пробелом.

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

QString QString::trimmed () const
Возвращает строку с удаленными пробелами в начале и конце.

QString str = "  lots\t of\nwhitespace\r\n ";
str = str.trimmed();
// str == "lots\t of\nwhitespace"
8 голосов
/ 21 ноября 2011

Если у вас нет или не нужно никаких пробелов в начале, вы можете использовать QString QString::trimmed () const.

Это игнорирует любые внутренние пробелы, которые исправляются альтернативным решением, предоставленным Андрейсом Каиниковым.

6 голосов
/ 21 ноября 2011

Вы можете сделать это с помощью регулярного выражения:

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

Будет ли это быстрее, я не уверен.

3 голосов
/ 19 мая 2012

Если вы не хотите делать глубокую копию строки:

QString & rtrim( QString & str ) {
  while( str.size() > 0 && str.at( str.size() - 1 ).isSpace() )
    str.chop( 1 );
  return str;
}
3 голосов
/ 21 ноября 2011

QString :: Trimmed () удаляет пробелы из начала и конца - если вы уверены, что в начале нет пробелов, вы можете использовать это.

1 голос
/ 07 апреля 2013

Нет глубокого копирования и повторных вызовов в размер / рубить:

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;
}
0 голосов
/ 21 ноября 2011

Это вариант ответа Фрэнка С. Томаса:

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 голосов
/ 21 ноября 2011

Насколько я знаю, единственными встроенными функциями являются trimmed() и simplified(). Так что вам нужно будет обрезать вручную. В этом случае вы должны использовать функцию QChar isSpace(), чтобы проверить, является ли символ пробелом.

...