从Qstring中删除行

时间:2015-04-19 11:27:39

标签: qt

我有一个5行的QString

“AAAAAR”

“BBBBB”

“CCCRC”

“DDDDD”

“EEEEE”

我想只用2到4行搜索“R”字符。如果其中一个内容为'R',则从我的QString中删除该行

我尝试了很多方法但没有成功。

2 个答案:

答案 0 :(得分:2)

您可以拆分每一行的字符串,为其提供一个包含5个字符串的QStringList。然后从2迭代到4,如果字符串包含R,则从字符串列表中删除字符串,最后再加入字符串列表。

  QString s("AAAAAR\nBBBBB\nCCCRC\nDDDDD\nEEEEE");
  QStringList l = s.split('\n');
  int i = 1, stop = 4;
  while (i < stop) {
      if (!l[i].contains('R')) ++i;
      else {
          l.removeAt(i);
          --stop;
        }
    }
  s = l.join('\n');

此解决方案应该更灵活,无论输入如何都可以工作,只需选择您想要签入的范围。

具有讽刺意味的是,如果循环反向迭代,则留下空洞并跟踪总计数是没有问题的。

for (int i = 3; i > 0; --i) if (l[i].contains('R')) l.removeAt(i);

答案 1 :(得分:0)

与ddriver的解决方案类似,但使用迭代器

#include <QApplication>
#include <QString>
#include <QStringList>
#include <QtCore>

int main(int argc, char** argv)
{
  QApplication app(argc,argv);

  QString s("AAAAAR\nBBBBB\nCCCRC\nDDDDD\nEEEEE");
  QStringList l = s.split('\n');
  for( QStringList::iterator it = ++l.begin(); it != --l.end(); ) {
    if( it->contains('R') ) {
      it = l.erase(it);
    } else {
      ++it;
    }
  }

  s = l.join("\n");
  qDebug() << l;
  return app.exec();
}

输出:

("AAAAAR", "BBBBB", "DDDDD", "EEEEE") 

我不会在for循环中使用增量,而是使用 QList::erase(iterator pos) Removes the item associated with the iterator pos from the list, and returns an iterator to the next item in the list

我更多地假设你想要从第二个元素循环到第二个元素,不管元素的数量是多少。

编辑:如果你想移动容器中的特定元素,你可以例如使用std::advance

#include <QApplication>
#include <QString>
#include <QStringList>
#include <QtCore>

#include <iterator>



int main(int argc, char** argv)
{
  QApplication app(argc,argv);

  QString s("AAAAAR\nBBBBB\nCCCRC\nDDDDD\nEEEEE");
  QStringList l = s.split('\n');
  QStringList::iterator it = l.begin();
  QStringList::iterator itEnd = l.begin();
  std::advance(it,2); // set the number to whatever start position you want
  std::advance(itEnd,4); // set the number to whatever end position you want
  for(  ; it != itEnd ; ) {
    if( it->contains('R') ) {
      it = l.erase(it);
    } else {
      ++it;
    }
  }

  s = l.join("\n");
  return app.exec();
}