2016-11-07 28 views
0

QRegularExpressionへの切り替えを開始しました。これを使用して、複数の区切り文字で文字列をトークン化しています。私は驚くべき動作に遭遇しました。これはバグであるようです。私はWindows上でQt 5.5.1を使用しています。ここで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 

キャレット(^)の使用 "のindexOf" コールに0以外の開始位置で使用した場合され表現が一致しないようにします。直感的に、私はキャレットが指定した位置の文字列と一致することを期待しました。代わりに、それは単に決して一致しません。

この問題を回避するために、splitRrefを使用するようにトークンを切り替えるつもりです。とにかくそれはややクリーナーでしょうが、これが正しい動作か、Qtにバグを報告する必要があるかどうかを理解する必要があります。

UPDATE:一部のトークンが浮動小数点数であるかどうかを検出するために正規表現を使用する必要があり、QStringRefでQRegularExpressionを使用できないため、splitRefを使用しても問題は完全に解決されません。その可能性のために、私はQStringRefトークンを実際のQStringに変換しなければなりませんでした。これは私が最初に避けようとしていたものでした。

+1

まあ、^文字列の最初の文字に一致し、そしてありがとう最初の文字 – infixed

答えて

1

^一致対象文字列場合、または複数行モードで改行後の先頭に。オフセットはこれらのセマンティクスを変更しません。したがって、/^ /(正規表現で)をM 100とオフセット1で一致させると、一致しません。

おそらくあなたは\Gが必要ですか? pcrepattern(3)から:被験体における最初のマッチング位置に

\Gマッチ

\Gアサーションは、startoffsetによって指定されるように現在のマッチング位置は、マッチの開始点である場合にのみ真である引数はpcre_exec()です。 の開始オフセットの値がゼロでない場合は、\Aとは異なります。それと

、このコード:

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

ない1を相殺しました。私は以前のマッチポジションからスタートしていなかったので、\ Gアサーションについては考えていませんでしたが、意味があります。これがQtのドキュメントに明示的に記述されていればうれしかったでしょうが、私はPerlの動作を知っています。ヘルプをよろしくお願いいたします。 – goug

+0

まあ、Perlでも同じです。 'perl -E '$ _ =" M 100 "; pos()= 1;/\ G /; ''(prints 1)なら$ - [0]とします。 – peppe

+0

私はPerlから知っているにもかかわらず、これを使用することは明らかではないと言っています。今日はかなりの時間がかかりますが、それは見逃しやすいのですから、\ Gのアサーションは他のオプションと同じくらいよく知られているわけではありません。そのヒントをQtドキュメントに含めるといいでしょう。 – goug