2014-10-08 6 views
0

У меня есть следующие функции, которые должны дать мне найденную строку из регулярного выражения:Регулярное выражение дает неправильные матчи в QRegEx

QString selectByPattern(QString const &oValue, QString const &oPattern, bool bRegularExpression) const 
{ 
    QString s; 
    QRegExp regex; 

    // default 
    regex.setPatternSyntax(QRegExp::RegExp); 

    regex.setPattern(oPattern); 
    int i = oValue.indexOf(regex); 
    int l = regex.matchedLength(); 

    if(i == -1 || l < 1) 
     return s; 

    s = oValue.mid(i, l); 

    return s; 
} 

Я использую строку *VALUE* в качестве входных данных для тестирования этого. Теперь я получаю следующие результаты:

oPattern = "[A-Z]" 
Output = "V" 

который является правильным. Для этой модели она дает мне первый символ верхнего регистра и длину 1.

Но когда я использую это:

oPattern = "[A-Z]*" 
Output = "" 

, и я не понимаю, почему. Возвращаемый индекс: 0, а также длина 0. Прежде всего, конечно, индекс неверен, потому что он должен быть 1. И тогда я не понимаю значение 0 как длину. Согласно документации (http://qt-project.org/doc/qt-4.8/qregexp.html#pattern) либо есть совпадение, то индекс является положительным значением, и в этом случае я ожидаю, что matchedLength() также должен вернуть некоторое значение `> 0``.

Я пропустил что-то здесь, или это проблема в Qt 5.2.1?

+0

Странно. Это работает правильно, но, согласно документам, и, насколько мне известно, регулярное выражение (которое довольно ограничено), это должно работать. – Devolus

ответ

3
[A-Z]* 

может соответствовать строке VALUE и пустой строке. See demo. Второй матч будет иметь длину 0, так как после VALUE ничего не осталось.

Вы можете попробовать [A-Z]+

Ваш индекс 0, так как позиции в строках начинаются с 0.

string: "VALUE" 
     ^^
position: 0 4 

Так матч (pos=0, len=3) будет следующим VAL (pos=0, len=1) - V и (pos=0, len=0) - пустая строка.

+0

Пока он работает с '+', на самом деле он не объясняет, почему он не работает с '*', хотя он и должен. – Devolus

+0

@Devolus ваш матч даст два результата. «ЦЕНА» и ''. Так что вторая может быть перезаписана первая. – vks

+0

Хммм. это может быть правдой. Я должен проверить это. Но я ожидал, что результат «indexOf» даст мне первое появление, иначе интерфейс действительно не имеет смысла ИМО. – Devolus