0

テキスト行の角かっこの間からテキストを抽出しようとしています。私はしばらく正規表現をいじっていましたが、必要なものを取得できません。(出力が何であるかを説明することさえできません)。コードは次のとおりです。

QRegExp rx_timestamp("\[(.*?)\]");
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";

入力行は次のとおりです。

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

出力は次のとおりです。

Captured texts:  (".") 
timestamp cap:  "." 
timestamp cap:  "" 
timestamp cap:  "" 
  1. 誰かが何が起こっているのか説明できますか? cap が "." を返すのはなぜですか。角括弧内にそのような文字が存在しない場合
  2. 誰かが正規表現を修正して、角括弧の間からタイムスタンプを抽出できますか?
4

1 に答える 1

3

あなたには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

それが役立つことを願っています。

于 2013-10-08T21:30:10.393 に答える