2013-08-12 10 views
0

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

Я не могу заставить его работать. a Начало, которое я назвал кодировкой 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, а не '%'

+0

Удалите ответ с вашего вопроса и поместите его правильно ниже в разделе ответов. – HamZa

+0

Ну, в прошлый раз люди просили меня сделать обратное: D Но хорошо, я оставлю оба. –

+0

nonesense. Ответ не является вопросом, поэтому вопрос не должен содержать ответа. Кстати, через некоторое время вы можете принять свой собственный ответ. – HamZa

ответ

1

нормально кладя каждый

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

как

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 

Колпачок (0) соответствует все выражение видимо

0

использовать не Захват группы:

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

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