QRegexp и знак процента (%)

Я пытаюсь сопоставить строку формы %foo% в шаблоне. Контекст: цель состоит в том, чтобы заменить %foo% значением столбца foo в возврате хранимой процедуры.

Я не могу заставить это работать. Начало Я думал, что причиной моих проблем была кодировка UTF8 моих шаблонов. Но даже нижеприведенное не работает:

#include <QCoreApplication>
#include <QRegExp>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QString str = "__%foo%____";


    std::cout << "with regex: %(.*)%" << std::endl;
    QRegExp re("%(.*)%",Qt::CaseInsensitive);
    re.indexIn(str);
    for(int pos = 0; pos < re.captureCount(); ++pos)
    {
        std::cout << re.cap(pos).toStdString() << std::endl;
    }

    std::cout << "with regex: \\%(.*)\\%" << std::endl;
    QRegExp re2("\\%(.*)\\%",Qt::CaseInsensitive);
    re2.indexIn(str);
    for(int pos = 0; pos < re2.captureCount(); ++pos)
    {
        std::cout << re2.cap(pos).toStdString() << std::endl;
    }

    std::cout << "with regex: %([^%])%" << std::endl;
    QRegExp re3("%([^%])%",Qt::CaseInsensitive);
    re3.indexIn(str);
    for(int pos = 0; pos < re3.captureCount(); ++pos)
    {
        std::cout << re3.cap(pos).toStdString() << std::endl;
    }

    std::cout << "with regex:  \\%([^\\%])\\%" << std::endl;
    QRegExp re4("\\%([^\\%])\\%",Qt::CaseInsensitive);
    re4.indexIn(str);
    for(int pos = 0; pos < re4.captureCount(); ++pos)
    {
        std::cout << re4.cap(pos).toStdString() << std::endl;
    }

    std::cout << "with regex: \\x25([^\\x25])\\x25" << std::endl;
    QRegExp re5("\\x25([^\\x25])\\x25",Qt::CaseInsensitive);
    re5.indexIn(str);
    for(int pos = 0; pos < re5.captureCount(); ++pos)
    {
        std::cout << re5.cap(pos).toStdString() << std::endl;
    }

    std::cout << "with regex: \\%(.*)\\%" << std::endl;
    QRegExp re6("\\%(.*)\\%",Qt::CaseInsensitive);
    re6.indexIn(str);
    for(int pos = 0; pos < re6.captureCount(); ++pos)
    {
        std::cout << re6.cap(pos).toStdString() << std::endl;
    }

    return a.exec();
}

Выход:

with regex: %(.*)%
%foo%
with regex: \%(.*)\%
%foo%
with regex: %([^%])%

with regex:  \%([^\%])\%

with regex: \x25([^\x25])\x25

with regex: \%(.*)\%
%foo%

Я хочу захватить только foo, а не «%»


person Community    schedule 12.08.2013    source источник
comment
Удалите ответ из своего вопроса и правильно поместите его ниже в разделе ответов.   -  person HamZa    schedule 12.08.2013
comment
Ну, в прошлый раз люди просили меня сделать наоборот :D Но хорошо, я оставлю оба.   -  person    schedule 12.08.2013
comment
вздор. Ответ — это не вопрос, поэтому вопрос не должен содержать ответа. Кстати, через некоторое время вы можете принять свой собственный ответ.   -  person HamZa    schedule 12.08.2013
comment
Что ж, для большинства вопросов ответ собирается из разных ответов и объединяется вверху при редактировании вопроса.   -  person    schedule 12.08.2013


Ответы (2)


хорошо помещая каждый

int pos = 0; pos < re.captureCount(); ++pos

as

int pos = 0; pos <= re.captureCount(); ++pos

У меня есть вывод:

with regex: %(.*)%
%foo%
foo
with regex: \%(.*)\%
%foo%
foo
with regex: %([^%])%


with regex:  \%([^\%])\%


with regex: \x25([^\x25])\x25


with regex: \%(.*)\%
%foo%
foo

Cap (0) соответствует всему выражению, по-видимому

person Community    schedule 12.08.2013

Используйте группы без захвата:

QString txt="____%foo%___some%__";
QRegExp rx("(?:%)[^%]*(?:%)");
pos = rx.indexIn(txt, 0);
rx.capturedTexts().at(1); //holds foo

Если вам нужны все совпадения, выполните цикл с indexIn и укажите pos+rx.matchedLenght() вместо 0

person Sebastian Lange    schedule 12.08.2013