【问题标题】:How do I remove trailing whitespace from a QString?如何从 QString 中删除尾随空格?
【发布时间】:2012-01-03 03:47:33
【问题描述】:

我想删除QString 中的所有尾随空格字符。我正在寻找使用QString 来执行Python 函数str.rstrip() 的操作。

我做了一些谷歌搜索,发现了这个: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);

有没有更简单的方法来做到这一点?我想在开头保留所有空格。

【问题讨论】:

  • 我认为它的逻辑有缺陷:应该是 while(str.endsWith(' ' ) || str.endsWith( '\n' )) str.chop(1);
  • @chac,是的,它会在这样的字符串上失败:“abc \n \n”

标签: c++ string qt qt4 trim


【解决方案1】:

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

【讨论】:

  • 为什么要重新发明轮子?使用 QString::trimmed()
  • @nullstellensatz trimmed 删除前导和尾随空格,而 rstrip 仅删除尾随空格。
  • 一定很喜欢 Qt 如何提供一些非常奇特的功能,但在一些最基本的任务中却失败了……2017 年,这个功能仍然缺失。
  • 一个人的“基本任务”是另一个人的“为什么会有人需要它?”
【解决方案2】:

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"

【讨论】:

  • simplified 还结合了多个空格 INSIDE 字符串
  • 是的。最初我发布了simplified 而不是trimmed,因为作者也提到删除\n。但无论如何,我已经更新了我的答案。谢谢。
  • 开头有空格,我想保留那个空格。我还想将空格保留在中间。我想我必须编写自己的修剪功能。谢谢!
  • 在这种情况下,我会使用正则表达式 - 简单而优雅。看看 skyhisi 答案。
【解决方案3】:

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

这会忽略任何内部空格,Andrejs Cainikovs 提供的替代解决方案已对此进行了纠正。

【讨论】:

    【解决方案4】:

    你可以用正则表达式来做到这一点:

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

    这是否会更快,我不确定。

    【讨论】:

    • 简单的字符串操作,如 indexOf()、left()、strstr() 等。恕我直言,总是比正则表达式快。
    • 这不是意见,而是事实。对于像剥离空格这样的普通事情,使用正则表达式相对非常复杂(但您有时可能需要正则表达式,当然,对于复杂的情况)。
    【解决方案5】:

    如果您不想对字符串进行深拷贝:

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

    【讨论】:

      【解决方案6】:

      QString::Trimmed() 从开头和结尾删除空格 - 如果您确定开头没有空格,您可以使用它。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

              您可以在字符串的开头添加一个非空格字符,修剪它,然后删除该字符

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

              【讨论】:

                猜你喜欢
                • 2015-02-15
                • 2015-04-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多