C++ 如何指定QString::indexOf方法?

C++ 如何指定QString::indexOf方法?,c++,qt,indexof,qstring,C++,Qt,Indexof,Qstring,我编写了如下源代码: int main(int argc, char *argv[]) { QString x = "start some text here end"; QString s = "start"; QString e = "end"; int start = x.indexOf(s, 0, Qt::CaseInsensitive); int end = x.indexOf(e, Qt::Ca

我编写了如下源代码:

    int main(int argc, char *argv[]) {
        QString x = "start some text here end";
        QString s = "start";
        QString e = "end";
        int start = x.indexOf(s, 0, Qt::CaseInsensitive); 
        int end = x.indexOf(e, Qt::CaseInsensitive); 

        if(start != -1){ // we found it
            QString y = x.mid(start + s.length(), ((end - (start + s.length())) > -1 ? (end - (start + s.length())) : -1)); // if you dont wanna pass in a number less than -1
            or
            QString y = x.mid(start + s.length(), (end - (start + s.length()))); // should not be any issues passing in a number less than -1, still works

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

}
intmain(intargc,char*argv[]){
QString x=“在此处开始一些文本”“结束”;
QString s=“开始”;
QString e=“结束”;
int start=x.indexOf(s,0,Qt::不区分大小写);
int end=x.indexOf(e,Qt::不区分大小写);
如果(start!=-1){//我们找到了它
QString y=x.mid(start+s.length(),((end-(start+s.length())>-1?(end-(start+s.length()):-1));//如果不想传入小于-1的数字
或
QString y=x.mid(start+s.length(),(end-(start+s.length());//如果传入的数字小于-1,则不应该是任何问题,仍然有效

qDebug()QString的indexOf声明如下:

int QString::indexOf ( const QString & str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
如果查看一下,您会发现,与您在调用indexOf时使用的参数相比,还有一个参数。这是因为它有一个默认值,并且是参数:

int from = 0
默认情况下,此from设置为0,这样,无论何时输入此值,都会从字符串的开头开始搜索,但您可以将其值设置为找到“start”单词的索引,如下所示:

int start = x.indexOf(s, 0, Qt::CaseInsensitive); 
int end = x.indexOf(e, start, Qt::CaseInsensitive); //notice the use of start as the 'from' argument
这样,您将获得第一个“开始”单词之后的第一个“结束”单词的索引。
希望这能有所帮助!

如果其他人想使用模式实现搜索

BEGIN\u无论什么\u END,最好使用以下正则表达式

QString TEXT("...YOUR_CONTENT...");
QRegExp rx("\\<\\?(.*)\\?\\>"); // match <?whatever?>
rx.setMinimal(true); // it will stop at the first ocurrence of END (?>) after match BEGIN (<?)

int pos = 0;    // where we are in the string
int count = 0;  // how many we have counted

while (pos >= 0) {// pos = -1 means there is not another match

    pos = rx.indexIn(TEXT, pos); // call the method to try match on variable TEXT (QString) 
    if(pos > 0){//if was found something

        ++count;
        QString strSomething = rx.cap(1);
        // cap(0) means all match
       // cap(1) means the firsrt ocurrence inside brackets

        pos += strSomething.length(); // now pos start after the last ocurrence

    }
}
QString文本(“…您的内容…”);
QRegExp rx(“\\”;//匹配

rx.setMinimal(true);//它将在比赛开始后第一次出现END(?>)时停止(老实说,我已经有了相同的想法:D-只是使用了“start+s.length()”而不是“start”。它也有帮助,但它没有解决问题,因为在QString“start”之后仍然有很多“END”出现。但是你不想在“开始”一词之后出现“结束”一词吗?如果你想做另一件事,请清楚地看到我们是否能提供帮助:)Qt Api无法完成这项工作。因此,我建议您使用循环来完成这项工作,例如查找第二个开始,然后再查找第二个结束。如果您的文本比这种情况更复杂,则必须使用lexer(手写,工具).好的,我回顾了我的源代码,它比示例案例更复杂,并且发现了一些错误,这些错误是导致失败结果的原因。抱歉,伙计们,但我猜昨天有点晚了。所以我现在接受了答案,因为它改进了我的源代码。您好