2011-11-21 16 views
25

Quiero eliminar todos los caracteres de espacios en blanco finales en un QString. Estoy buscando hacer lo que la función de Python str.rstrip() con un QString.¿Cómo elimino los espacios en blanco finales de un QString?

he hecho un poco buscando en Google y encontré esto: http://www.qtforum.org/article/20798/how-to-strip-trailing-whitespace-from-qstring.html

Así que lo que tengo en este momento es algo como esto:

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

¿Hay una manera más sencilla de hacer esto? Quiero mantener todos los espacios en blanco al principio.

+3

Creo que la lógica es defectuosa: debería ser while (str.endsWith ('') || str.endsWith ('\ n')) str.chop (1); – CapelliC

+0

@chac, sí, fallará en una cadena como esta: "abc \ n \ n" –

Respuesta

35

QString tiene dos métodos relacionados con los espacios en blanco de corte:

  • QString QString::trimmed() const
    devuelve una cadena que ha eliminado los espacios en blanco desde el principio y el fin.
  • QString QString::simplified() const
    Devuelve una cadena que tiene espacios en blanco eliminados desde el principio y el final, y que tiene cada secuencia de espacio en blanco interno reemplazado por un espacio simple.

Si desea eliminar solo los espacios en blanco al final, debe implementarlo usted mismo.Aquí es una implementación de este tipo que imita la implementación de 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

¿Por qué reinventar la rueda? Use QString :: trimmed() – nullstellensatz

+4

@nullstellensatz 'trimmed' elimina los espacios en blanco iniciales y finales mientras que 'rstrip' solo elimina los espacios en blanco finales. –

+0

Use C# - str.TrimStart(), str.TrimEnd() .... Es una broma: D – hfrmobile

7

Si no tiene o no necesita ningún espacio en blanco al principio tampoco, puede usar QString QString::trimmed() const.

Esto ignora cualquier espacio en blanco interno, que se corrige con la solución alternativa proporcionada por Andrejs Cainikovs.

25

QString proporciona solo dos funciones relacionadas con el recorte. En caso de que no se ajusten a sus necesidades, me temo que debe implementar su propia función de recorte personalizado.

QString QString::simplified() const
Devuelve una cadena que se ha eliminado el espacio en blanco desde el principio y el final, y que tiene cada secuencia de espacios en blanco interno reemplazado con un solo espacio.

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

QString QString::trimmed() const
devuelve una cadena que ha eliminado los espacios en blanco desde el principio y el fin.

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

simplificado también combina múltiples espacios en blanco DENTRO de la cadena –

+0

Sí. Originalmente publiqué 'simplified' y no' trimmed' porque el autor menciona eliminar '\ n' también. Pero de todos modos, he actualizado mi respuesta. Gracias. –

+0

Hay espacios en blanco al principio, y quiero mantener ese espacio en blanco. También quiero mantener el espacio en blanco en el medio. Creo que tendré que escribir mi propia función de recorte. ¡Gracias! –

4

QString::Trimmed() elimina los espacios en blanco desde el principio y el final - si está seguro de que no hay espacios en blanco al inicio puede utilizar este.

0

Hasta donde yo sé, las únicas funciones incorporadas se recortan() y se simplifican(). Por lo tanto, tendrá que recortar manualmente. En ese caso, debe usar la función QChar isSpace() para verificar si un carácter es un carácter de espacio.

6

Puede hacerlo con una expresión regular:

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

si esto sería más rápido, no estoy seguro.

+1

Operaciones de cadenas simples como indexOf(), left(), strstr() y etc. siempre más rápido que las expresiones regulares en mi humilde opinión. –

+0

No es una opinión, es un hecho. Para una cosa mundana como quitar espacios en blanco, usar Regex es relativamente muy complejo (pero a veces * necesitas * expresiones regulares, por supuesto, para situaciones complejas). – csl

0

Esta es una variación de la respuesta publicado por 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 ""; 
} 
3

Si no desea hacer una profunda copia de la cadena:

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

No se copia en profundidad y no repetidas llamadas a tamaño/chuleta:

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