2011-11-21 182 views
25

我想刪除QString中的所有尾部空白字符。我正在尋找做什麼Python函數str.rstrip()QString如何從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); 

有沒有一種簡單的方法來做到這一點?我想在開頭保留所有的空格。

+3

我認爲它的邏輯有缺陷:應該是while(str.endsWith('')|| str.endsWith('\ n'))str.chop(1); – CapelliC

+0

@chac,是的,它會失敗,像這樣的字符串:「abc \ n \ n」 –

回答

35

QString有兩個相關的微調空白方法:

如果您只想刪除尾隨空白,則需要自行實施。這裏有一個這樣模仿的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 ""; 
} 
+0

爲什麼要重新發明輪子?使用QString :: trimmed() – nullstellensatz

+4

@nullstellensatz'trimmed'刪除前導和尾隨空白,而'rstrip'只刪除尾部空白。 –

+0

使用C# - str.TrimStart(),str.TrimEnd()....只是在開玩笑:D – hfrmobile

7

如果您在開始時沒有或不需要任何空白,您可以使用QString QString::trimmed() const

這忽略了任何內部空白,這由Andrejs Cainikovs提供的替代解決方案糾正。

25

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" 
+0

簡化也結合了多個空格INSIDE字符串 –

+0

是的。本來我已經發布'simplified'而不是'trimmed',因爲作者也提到刪除'\ n'。但無論如何,我已經更新了我的答案。謝謝。 –

+0

開頭有空格,我想保留這個空格。我也想保留中間的空白。我想我必須編寫自己的修剪功能。謝謝! –

4

QString::Trimmed()去除開始和結束的空白 - 如果你一定有你可以使用這個開始沒有空格。

0

據我所知,唯一的內置函數是trimmed()和simplified()。所以你需要手動修剪。在這種情況下,您應該使用QChar函數isSpace()來檢查一個字符是否爲空格字符。

6

你可以用正則表達式做到這一點:

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

這是否會更快,我不知道。

+1

像indexOf(),left(),strstr()等簡單的字符串操作總是快於正則表達式恕我直言。 –

+0

這不是一個意見,這是一個事實。對於像剝離空白這樣的世俗事物,使用正則表達式相對來說非常複雜(但當然,對於複雜的情況,您可能*需要*正則表達式)。 – csl

0

這是張貼由Frank S.托馬斯回答的變化:

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

如果你不想做一個深

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

沒有深拷貝和無重複調用尺寸/印章:​​字符串拷貝

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