可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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:
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.
回答9:
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 "";
}