【问题标题】:QString remove last charactersQString 删除最后一个字符
【发布时间】:2017-11-09 12:00:00
【问题描述】:

如何从 /home/admin/job0/Job 中删除 /Job

QString name = "/home/admin/job0/Job"

我想删除“/”之后的最后一个字符串

【问题讨论】:

  • 由于您似乎在玩目录,您可以使用QDir 类及其QDir::cdUp 方法。
  • 这是一个 qt 问题,还是一个 C++ 问题?你试过什么了?您想只删除 "/" 之后的最后一个字符串还是 删除 /Job 包括斜杠?
  • 也许您可以使用QFileInfo 来完成这项任务。
  • 如果父目录不存在,QDir::cdUp 将不起作用。最好使用QFileInfo(name).dir().path(),它不会检查是否存在。

标签: qt qstring


【解决方案1】:

QString::chop() 用于您已经知道要删除多少个字符的情况。
和QString::remove()一样,只是在字符串后面起作用。

【讨论】:

    【解决方案2】:

    用QString::lastIndexOf 查找最后一个斜线。 之后使用QString::left 获取子字符串,直到最后一个斜杠出现的位置

    QString name = "/home/admin/job0/Job";
    int pos = name.lastIndexOf(QChar('/'));
    qDebug() << name.left(pos);
    

    这将打印:

    "/home/admin/job0"
    

    您应该检查 int pos 是否为 -1 以确保完全找到斜线。

    要在输出中包含最后一个斜线,请将 +1 添加到已建立的位置

    qDebug() << name.left(pos+1);
    

    将输出:

    "/home/admin/job0/"
    

    【讨论】:

    • 我认为您的解决方案是常见的:D
    • 您不需要检查 pos ==-1 因为如果或小于零,将返回整个字符串
    【解决方案3】:

    对于以后的读者来说,最容易理解的可能是:

    QString s("/home/admin/job0/Job");
    s.truncate(s.lastIndexOf(QChar('/'));
    qDebug() << s;
    

    正如代码字面意思所说的那样。

    【讨论】:

    • 在某些情况下存在一个问题:如果字符串不包含斜线,则完全清除
    【解决方案4】:

    你可以这样做:

    QString s("/home/admin/job0/Job");
    s.remove(QRegularExpression("\\/(?:.(?!\\/))+$"));
    // s is "/home/admin/job0" now
    

    【讨论】:

      【解决方案5】:

      如果您使用高于 6 的 Qt 并且确定“/”包含在您的单词中,您应该使用 QString::first(qsizetype n) const 函数而不是 QString::left(qsizetype n) const

      例子:

      QString url= "/home/admin/job0/Job"
      QString result=url.first(lastIndexOf(QChar('/')));
      

      如果你运行这些代码:

      QElapsedTimer timer;
      timer.start();
      for (int j=0; j<10000000; j++)
      {
          QString name = "/home/admin/job0/Job";
          int pos = name.lastIndexOf("/");
          name.left(pos);
      }
      qDebug() << "left method" << timer.elapsed() << "milliseconds";
      timer.start();
      for (int j=0; j<10000000; j++)
      {
          QString name = "/home/admin/job0/Job";
          int pos = name.lastIndexOf(QChar('/'));
          name.first(pos);
      }
      qDebug() << "frist method" << timer.elapsed() << "milliseconds";
      

      结果:

      离开方法 10034 毫秒

      第一种方法 8098 毫秒

      【讨论】:

        【解决方案6】:

        很抱歉 4 年后才回复这篇文章,但我有(我认为)最有效的答案。 你可以使用

        qstr.remove(0, 1); //removes the first character
        qstr.remove(1, 1); //removes the last character
        

        这就是你必须做的一切,从 QString 中一个接一个(第一个或最后一个)删除字符,直到剩下 1 个字符。

        【讨论】:

        • 这如何解决OP的问题,他要的是字符串的结尾,而不是开头。
        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        相关资源
        最近更新 更多