如何从QString中删除尾随空格?

40

我想要移除 QString 中所有的尾部空格字符。我希望做到类似于 Python 函数 str.rstrip() 对于 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
@chac,是的,它会在像这样的字符串上失败:“abc \n \n” - Di Zou
10个回答

63

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

1
为什么要重复造轮子?使用 QString::trimmed()。 - nullstellensatz
4
trimmed 可以去除字符串开头和结尾的空格,而 rstrip 只能去除字符串结尾的空格。 - Frank S. Thomas
Qt提供了一些非常华丽的功能,但在一些最基本的任务上却失败了...2017年,这种功能仍然缺失。 - rbaleksandar
7
一个人的“基本任务”可能是另一个人的“为什么会有人需要那个?” - Jeremy Friesner

30

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"

简化版还会合并字符串内部的多个空格。 - Martin Beckett
是的。最初我发布了“简化”的内容,而不是“修剪”的内容,因为作者还提到了删除\n。但无论如何,我已经更新了我的答案。谢谢。 - Andrejs Cainikovs
开头有空格,我想保留那个空格。我也想保留中间的空格。我猜我得写自己的修剪函数。谢谢! - Di Zou
在这种情况下,我会选择正则表达式 - 简单而优雅。看看 skyhisi 的回答。 - Andrejs Cainikovs

9
如果您在开头没有或不需要任何空格,您可以使用QString QString :: trimmed () const

这将忽略任何内部空格,这是由Andrejs Cainikovs提供的替代解决方案进行更正。


8

您可以使用正则表达式来完成:

#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()等,总体而言比正则表达式更快。 - bartolo-otrit
这不是观点,而是事实。对于像去除空格这样的平凡事情,使用正则表达式相对来说非常复杂(但在复杂情况下你有时可能需要正则表达式)。 - csl

4
如果你不想创建一个字符串的深拷贝:
QString & rtrim( QString & str ) {
  while( str.size() > 0 && str.at( str.size() - 1 ).isSpace() )
    str.chop( 1 );
  return str;
}

3

QString::Trimmed()函数可以去除字符串开头和结尾的空白字符,如果你确定开头没有空格,那么可以使用该函数。


2

没有深拷贝和重复调用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;
}

0
据我所知,唯一的内置函数是trimmed()simplified()。因此,您需要手动修剪。在这种情况下,您应该使用QChar函数isSpace()来检查字符是否为空格字符。

0

这是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 "";
}

0

你可以在字符串开头添加一个非空字符,然后对其进行修剪,最后再移除该字符

str1=QString("-"+str).trimmed().mid(1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接