2016-11-07 2 views
0

Я только что начал переключиться на QRegularExpression, и я использую его для того, чтобы токенизировать строку с несколькими возможностями разграничителя. Я столкнулся с удивительным поведением, которое кажется мне ошибкой. Я использую Qt 5.5.1 для Windows.Неожиданное поведение QRegularExpression

Вот пример код:

#include <QRegularExpression> 
#include <QString> 
#include <QtDebug> 

int main(int argc, char *argv[]) 
{ 
    Q_UNUSED (argc); 
    Q_UNUSED (argv); 
    QRegularExpression regex ("^ "); 

    qDebug() << "Expected: " << QString ("M 100").indexOf(regex); 
    qDebug() << "NOT expected:" << QString ("M 100").indexOf(regex, 1); 
    qDebug() << "Expected: " << QString (" 100").indexOf(regex); 

    QRegularExpression regex1 (" "); 
    qDebug() << "Expected: " << QString ("M 100").indexOf(regex1); 
} 

И выход:

Expected:  -1 
NOT expected: -1 
Expected:  0 
Expected:  1 

Использование вставки (^) при использовании с исходным положением, отличным от 0 в вызове "IndexOf" является предотвращая совпадение выражения. Интуитивно я ожидал, что каретка соответствует строке в указанной мной позиции. Вместо этого он просто никогда не подходит.

Я собираюсь переключить токенизацию на использование splitRref, чтобы избежать этой проблемы. Хотя в любом случае это, вероятно, немного чище, мне нужно понять, правильное ли это поведение, или если я должен сообщать об ошибке в Qt.

UPDATE: Использование splitRef не полностью решает мою проблему, потому что мне нужно использовать регулярное выражение, чтобы определить, являются ли некоторые токены числами с плавающей запятой, и я не могу использовать QRegularExpression с QStringRef. Для этой возможности я должен преобразовать токен QStringRef в реальный QString, чего я пытался избежать в первую очередь.

+1

Ну,^совпадает с первым символом строки, и смещение 1 не первый символ – infixed

ответ

1

^ соответствует в начале строки темы или после перевода строки когда многострочного режима. Смещение не изменяет эту семантику. Следовательно, совпадение /^ / (в обозначении регулярных выражений) против M 100 со смещением 1 правильно приводит к совпадению.

Возможно, вы хотите \G? От pcrepattern(3):

\G матчей на первой позиции соответствия в теме

\G утверждение справедливо только тогда, когда текущая позиция поиска находится в начальной точке матча, как определено startoffset аргумент pcre_exec(). Он отличается от \A, когда значение startoffset отличное от нуля.

При том, что этот код:

QRegularExpression regex ("\\G "); 

qDebug() << "Expected: " << QString ("M 100").indexOf(regex); 
qDebug() << "NOT expected:" << QString ("M 100").indexOf(regex, 1); 
qDebug() << "Expected: " << QString (" 100").indexOf(regex); 

печатает

Expected:  -1 
NOT expected: 1 
Expected:  0 
+0

Спасибо. Я не думал об утверждении \ G, так как я не начинал с предыдущей позиции матча, но это имеет смысл. Было бы неплохо, если бы это было явно указано в документах Qt, но я знаю поведение Perl. Цените помощь. – goug

+0

Ну, это то же самое в Perl: 'perl -E '$ _ =" M 100 "; pos() = 1; скажем $ - [0], если/\ G /; ''(печатает 1). – peppe

+0

Я говорю, что это не очевидно использовать, хотя я знаю это с Perl. Это стоило мне довольно много времени сегодня, и так как это легко пропустить, и утверждение \ G не так широко известно, как другие варианты, было бы неплохо иметь этот совет, включенный в документы Qt , – goug

Смежные вопросы