あなたには2つのことが欠けています。バックスラッシュをエスケープし、setMinimal
. 下記参照。
QString line = "messages:[2013-10-08 09:13:41] NOTICE[2366] chan_sip.c: Registration from '\"xx000 <sip:xx000@183.229.164.42:5060>' failed for '192.187.100.170' - No matching peer found";
QRegExp rx_timestamp("\\[(.*)\\]");
rx_timestamp.setMinimal(true);
int pos = rx_timestamp.indexIn(line);
if (pos > -1) {
qDebug() << "Captured texts: " << rx_timestamp.capturedTexts();
qDebug() << "timestamp cap: " <<rx_timestamp.cap(0);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(1);
qDebug() << "timestamp cap: " <<rx_timestamp.cap(2);
} else qDebug() << "No indexin";
出力:
Captured texts: ("[2013-10-08 09:13:41]", "2013-10-08 09:13:41")
timestamp cap: "[2013-10-08 09:13:41]"
timestamp cap: "2013-10-08 09:13:41"
timestamp cap: ""
更新: 何が起こっているか:
C++ ソース コードのバックスラッシュは、次の文字が などのエスケープ文字であることを示します\n
。正規表現でバックスラッシュを表示するには、次のようにバックスラッシュをエスケープする必要があります。これにより、Ruby、Perl、または Python が使用するものと同様に \\
、正規表現エンジンが を認識できるようになります。\
角括弧もエスケープする必要があります。これは、通常、正規表現で要素の範囲を示すために使用されるためです。
したがって、正規表現エンジンが角かっこ文字を確認するには、それを送信する必要があります
\[
\
しかし、C++ ソース ファイルは、文字が 2 つ連続していないと文字列に変換できないため、次のようになります。
\\[
正規表現を学んでいる間、私はGSkinner によるこの正規表現ツールを使用するのが好きでした。ページの右側に固有のコードと文字のリストがあります。
QRegEx
正規表現と正確には一致しません。ドキュメントを調べてみると、多くの小さなことがわかります。貪欲対怠惰なマッチングを行う方法など。
QRegExp と QSyntaxHighlighter の二重引用符付きテキスト
正規表現パーサーから見た限り、キャプチャがどのようにリストされるかはかなり典型的です。キャプチャ リストでは、最初にそれらすべてがリストされ、次に最初のキャプチャ グループ (または最初の括弧で囲まれたもの) がリストされます。
http://qt-project.org/doc/qt-5.0/qtcore/qregexp.html#cap
http://qt-project.org/doc/qt-5.0/qtcore/qregexp.html#capturedTexts
より多くの一致を見つけるには、 を繰り返し呼び出す必要がありますindexIn
。
http://qt-project.org/doc/qt-5.0/qtcore/qregexp.html#indexIn
QString str = "offsets: 1.23 .50 71.00 6.00";
QRegExp rx("\\d*\\.\\d+"); // primitive floating point matching
int count = 0;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
++count;
pos += rx.matchedLength();
}
// pos will be 9, 14, 18 and finally 24; count will end up as 4
それが役立つことを願っています。