2011-11-21 15 views
25

Desidero rimuovere tutti i caratteri di spazi vuoti finali in un QString. Sto cercando di fare ciò che la funzione Python str.rstrip() con un QString.Come rimuovo gli spazi bianchi finali da un QString?

ho fatto qualche Googling, e abbiamo trovato questo: http://www.qtforum.org/article/20798/how-to-strip-trailing-whitespace-from-qstring.html

Quindi quello che ho in questo momento è qualcosa di simile:

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

C'è un modo più semplice per fare questo? Voglio mantenere tutti gli spazi bianchi all'inizio.

+3

Penso che la logica sia errata: dovrebbe essere while (str.endsWith ('') || str.endsWith ('\ n')) str.chop (1); – CapelliC

+0

@chac, si fallirà su una stringa come questa: "abc \ n \ n" –

risposta

35

QString ha due metodi sono collegati spazi rifilatura:

Se si desidera rimuovere solo spazi vuoti finali, è necessario implementarli autonomamente.Ecco un esempio di attuazione che imita la realizzazione di 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

Perché reinventare la ruota? Usa QString :: trimmed() – nullstellensatz

+4

@nullstellensatz 'trimmed' rimuove gli spazi bianchi iniziali e finali mentre' rstrip' rimuove solo gli spazi bianchi finali. –

+0

Usa C# - str.TrimStart(), str.TrimEnd() .... Sto scherzando: D – hfrmobile

7

Se non si dispone o non è necessario alcun spazio bianco all'inizio, è possibile utilizzare QString QString::trimmed() const.

Questo ignora qualsiasi spazio interno interno, che viene corretto dalla soluzione alternativa fornita da Andrejs Cainikovs.

25

QString fornisce solo due funzioni relative al ritaglio. Nel caso in cui non soddisfino le tue esigenze, temo che sia necessario implementare la propria funzione di ritaglio personalizzata.

QString QString::simplified() const
restituisce una stringa che è spazi rimossa dal inizio e la fine, e che ha ogni sequenza di spazi interni sostituito con un singolo spazio.

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

QString QString::trimmed() const
restituisce una stringa che ha spazi rimosso dal inizio e la fine.

QString str = " lots\t of\nwhitespace\r\n "; 
str = str.trimmed(); 
// str == "lots\t of\nwhitespace" 
+0

semplificato combina anche più spazi bianchi INSIDE la stringa –

+0

Sì. Originariamente ho pubblicato 'semplificato 'e non' tagliato' perché l'autore menziona anche la rimozione di '\ n'. Ma comunque, ho aggiornato la mia risposta. Grazie. –

+0

C'è spazio bianco all'inizio e voglio mantenere quello spazio vuoto. Voglio anche mantenere gli spazi bianchi nel mezzo. Credo che dovrò scrivere la mia funzione di rifilatura. Grazie! –

4

QString::Trimmed() rimuove gli spazi bianchi dall'inizio e alla fine - se si è certi non v'è alcun spazio bianco all'inizio è possibile utilizzare questo.

0

Per quanto ne so, le uniche funzioni integrate sono tagliate() e semplificate(). Quindi dovrai tagliare manualmente. In tal caso dovresti usare la funzione QChar isSpace() per verificare se un personaggio è un carattere spaziale.

6

È possibile farlo con una 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; 
} 

se questo sarebbe più veloce, non sono sicuro.

+1

Operazioni di stringa semplici come indexOf(), left(), strstr() ed ecc. Sempre più veloci delle espressioni regolari IMHO. –

+0

Non è un'opinione, è un dato di fatto. Per una cosa banale come l'eliminazione degli spazi bianchi, l'uso di Regex è relativamente complesso (ma a volte è necessario * regex * naturalmente, per situazioni complesse). – csl

0

Questa è una variante della risposta inviato da Frank S. Tommaso:

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

Se non si vuole fare una profonda copia della stringa:

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

No copia completa e non ripetute chiamate a dimensioni/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; 
} 
Problemi correlati