2011-11-21 10 views
25

Chcę usunąć wszystkie znaki końca spacji w QString. Szukam zrobić to, co funkcja Python str.rstrip() z .Jak usunąć końcowe odstępy z QString?

zrobiłem niektóre googling, i znalazłem to: http://www.qtforum.org/article/20798/how-to-strip-trailing-whitespace-from-qstring.html

Więc co mam teraz jest coś takiego:

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

Czy istnieje prostszy sposób to zrobić? Chcę zachować wszystkie białe znaki na początku.

+3

Myślę, że logika jest wadliwa: powinno być, gdy (str.endyWith ('') || str.endyWith ('\ n')) str.chop (1); – CapelliC

+0

@chac, tak się nie powiedzie na takim łańcuchu: "abc \ n \ n" –

Odpowiedz

35

QString ma dwie metody związane z przycinania spacji:

Jeśli chcesz usunąć tylko końcowe białe znaki, musisz to zaimplementować samodzielnie.Oto taka realizacja, która naśladuje realizację 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

Po co wyważać nowe koło? Użyj QString :: trimmed() – nullstellensatz

+4

@ nullstellensatz 'trimmed' usuwa początkowe i końcowe białe znaki, podczas gdy' rstrip' usuwa wyłącznie spacje. –

+0

Użyj C# - str.TrimStart(), str.TrimEnd() .... Po prostu żartuję: D – hfrmobile

7

Jeśli nie masz lub nie potrzebujesz żadnych spacji na początku, możesz użyć QString QString::trimmed() const.

To ignoruje wszelkie wewnętrzne spacje, które zostały poprawione przez alternatywne rozwiązanie dostarczone przez Andrejs Cainikovs.

25

QString zapewnia tylko dwie funkcje związane z przycinaniem. W przypadku, gdy nie odpowiadają twoim potrzebom, obawiam się, że musisz zaimplementować własną niestandardową funkcję przycinania.

QString QString::simplified() const
Zwraca ciąg znaków, który został usunięty z białych znaków początku i końca, i który ma każdą sekwencję wewnętrznego spacji zastąpione pojedynczym odstępem.

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

QString QString::trimmed() const
Zwraca ciąg znaków, który został usunięty z spacje na początku i na końcu.

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

uproszczony również łączy wiele białych znaków WEWNĄTRZ łańcucha znaków –

+0

Tak. Oryginalnie napisałem "uproszczony", a nie "przycięty", ponieważ autor wspomina również o usunięciu '\ n'. Ale w każdym razie, zaktualizowałem swoją odpowiedź. Dzięki. –

+0

Na początku są białe spacje i chcę zachować to białe spacje. Chcę również zachować białe znaki pośrodku. Chyba będę musiał napisać własną funkcję przycinania. Dzięki! –

4

QString::Trimmed() usuwa spacje z początku i końca - jeśli jesteś pewien, że nie ma spacji na początku można użyć tego.

0

O ile mi wiadomo, tylko wbudowane funkcje są przycinane() i uproszczone(). Będziesz musiał przyciąć ręcznie. W takim przypadku należy użyć funkcji QChar isSpace(), aby sprawdzić, czy znak jest spacji.

6

Można to zrobić za pomocą 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; 
} 

czy będzie to szybciej, nie jestem pewien.

+1

Proste operacje na ciągach, takie jak indexOf(), left(), strstr() i itp., Zawsze szybsze niż IMHO wyrażeń regularnych. –

+0

To nie jest opinia, to fakt. W przypadku rzeczy przyziemnych, takich jak usuwanie białych znaków, używanie Regex jest stosunkowo złożone (ale czasami możesz * potrzebować * regex oczywiście w skomplikowanych sytuacjach). – csl

0

Jest to odmiana odpowiedzi wysłane przez Franka 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 ""; 
} 
3

Jeśli nie chcesz, aby głęboka kopia napisu:

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

nr głębokiej kopii i bez wielokrotnych wezwań do wielkości/kotlet:

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; 
} 
Powiązane problemy