Я только что начал переключиться на 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 не первый символ – infixed