Как мне удалить конечные пробелы из QString?
Я хочу удалить все завершающие пробельные символы в 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);
Есть ли более простой способ сделать это? Я хочу сохранить все пробелы в начале.
10 ответов
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 "";
}
QString предоставляет только две функции, связанные с обрезкой. В случае, если они не соответствуют вашим потребностям, я боюсь, что вам нужно реализовать свою собственную функцию обрезки.
QString QString:: упрощенный () 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"
Если у вас нет или не нужно никаких пробелов в начале, вы можете использовать QString QString::trimmed () const
,
Это игнорирует любые внутренние пробелы, которые исправляются альтернативным решением, предоставленным Andrejs Cainikovs.
Вы можете сделать это с помощью регулярного выражения:
#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;
}
Будет ли это быстрее, я не уверен.
Если вы не хотите делать глубокую копию строки:
QString & rtrim( QString & str ) {
while( str.size() > 0 && str.at( str.size() - 1 ).isSpace() )
str.chop( 1 );
return str;
}
QString::Trimmed() удаляет пробелы из начала и конца - если вы уверены, что в начале нет пробелов, вы можете использовать это.
Нет глубокого копирования и повторных обращений к формату:
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;
}
Вы можете добавить символ без пробела в начало строки, обрезать его, а затем удалить символ
str1=QString("-"+str).trimmed().mid(1);
Насколько я знаю, единственные встроенные функции обрезаны () и упрощены (). Так что вам нужно будет обрезать вручную. В этом случае вы должны использовать функцию QChar isSpace(), чтобы проверить, является ли символ пробелом.
Это вариант ответа Фрэнка С. Томаса:
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 "";
}