gpt4 book ai didi

c++ - 使用相同的前一个词和相同的后一个词读取不同的 QStrings? QString::indexOf

转载 作者:行者123 更新时间:2023-11-28 00:59:18 27 4
gpt4 key购买 nike

我从文件中读取了两个 QString (ValueOne,ValueTwo)(只是一个基本示例)

int main(int argc, char *argv[]) {
QString x = ("yes "
"start ValueOne end"
"no"
"start ValueTwo end");

//try to read ValueOne
QString s = "start";
QString e = "end";
int start = x.indexOf(s, 0, Qt::CaseInsensitive);
int end = x.indexOf(e, Qt::CaseInsensitive);

if(start != -1){

QString y = x.mid(start + s.length(), (end - (start + s.length())));

qDebug() << y << (start + s.length()) << (end - (start + s.length()));

//try to read ValueTwo
QString s2 = "start";
QString e2 = "end";
int start2 = x.indexOf(s2, 0, Qt::CaseInsensitive);
int end2 = x.indexOf(e2, Qt::CaseInsensitive);

if(start2 != -1){

QString y2 = x.mid(start2 + s.length2(), (end2 - (start2 + s.length2())));

qDebug() << y2 << (start2 + s.length2()) << (end2 - (start2 + s.length2()));
}
}

如您所见,源代码不能仅仅通过“开始”和“结束”来区分 ValueOne 和 ValueTwo,因为 QString::mid() 方法(据我所知是逐行进行的)都有相同的起始位置和相同的长度(参见 http://qt-project.org/doc/qt-4.8/qstring.html#mid )。因此我想如果整个字符串是一行

QString x = "yes start ValueOne end no start ValueTwo end ";

我可以区分 QString s = "yes start"和 QString s2 = "no start"的两个值。那么将多行字符串转换为单行字符串是一种解决方案吗?我该怎么做?或者还有其他更好的解决方案吗?问候

最佳答案

正如我在您的其他问题中提到的那样,我更喜欢 QRegExp .它似乎更具可读性。

如果您的第一个字符串始终是 2n 值并且您的第二个字符串是 2n+1 您可以使用模运算符:

#include <QDebug>
#include <QString>
#include <QStringList>
#include <QRegExp>

int main()
{
QString x = ("yes \nstart ValueOne end \nno \nstart ValueTwo end\n"
"yes \nstart ValueThree end \nno \nstart ValueFour end ");

QStringList y1;
QStringList y2;

// create regular expression
QRegExp rx("start\\s+(.+)\\s+end\\s+", Qt::CaseInsensitive);

// don't try to get the largest match (start ValueOne ... ValueFour end)
// minimal match should be (start ValueOne end)
rx.setMinimal(true);

int pos=0;
int i=0; // counter

// look for possible matches
QString match;
while ((pos=rx.indexIn(x, pos)) != -1) {
i+=1; // increase counter for every match
match=rx.cap(1); // get first match in (.+)

// use modulo to distinguish between y1/y2
if (i % 2) {
y1 << match;
} else {
y2 << match;
}

pos+=rx.matchedLength();
}

qDebug() << "y1:" << y1;
qDebug() << "y2:" << y2;

return 0;
}

关于c++ - 使用相同的前一个词和相同的后一个词读取不同的 QStrings? QString::indexOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9626952/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com