0

Cocoa アプリで RKL を使用して、ラップされたタスクからログ ステートメントを解析しています。

パターン:

(?:.+) \[.+?\] (.+) \[.+?\] logged in (?:.+)

テストデータ:

2011-07-11 00:48:19 [INFO] Preparing spawn area: 97
2011-07-11 00:48:19 [INFO] Done (2175837000ns)! For help, type "help" or "?"
2011-07-11 00:48:42 [INFO] mikeyward [/127.0.0.1:59561] logged in with entity id blahblah

私がインターネットで試したすべての RegEx テスターは、3 行目に一致し、「mikeyward」をキャプチャします。

Objective-C コード:

NSString *loggedInPattern = @"(?:.+) \\[.+?\\] (.+) \\[.+?\\] logged in (?:.+)";
NSArray *captures = [searchString arrayOfCaptureComponentsMatchedByRegex:loggedInPattern];
NSString *username = [captures objectAtIndex:0];

問題: searchString が有効で、サンプル データが含まれていることを確認したにもかかわらず、RKL はユーザー名をキャプチャするどころか、行を一致させることができません。上記の例では、captures 配列がゼロ オブジェクトで返され、エラー チェックを行っていないため、例外がスローされます :)

正規表現チェッカーが一致を確認してキャプチャするのに、RKL がそれを見逃す理由を理解するための支援をいただければ幸いです。

ありがとう〜

4

2 に答える 2

0

マッチャーは単一行のマッチングのみを行っています。オプション付きのバージョンを使用して渡しますRKLMultiline

于 2011-07-11T05:50:54.503 に答える
0

あなたの問題はこれに関連しているかもしれませんし、単に破滅的なバックトラッキングの場合かもしれません。私のアドバイスはどちらの場合も同じです。どの量指定子も影響範囲が重複しないように正規表現を記述してください。例えば:

(?m)^[ 0-9:-]+\[[A-Z]+\] (\S+) \[[^\]]+\] logged in .+$

あなたの正規表現では、最初(?:.+)は最初に行内のすべての文字を飲み込みますが、それらのほとんどを返す必要があるだけなので、残りの正規表現が一致する可能性があります。 [ 0-9:-]+一方、スペース、数字、コロン、ハイフン以外の文字を検出するとすぐに消費を停止します。

次の文字がない場合、[それ以上は進まず、全体的な一致の試みは以前よりもはるかに迅速に失敗します。同様に、終了を[A-Z]+吹き飛ばすことはできません、次のスペースをオーバーランすることはできません、そして [^]]+ ] .+` はすでに私たちが望んでいること、つまり、次の改行またはテキストの終わり。]\S+stops before the next. I didn't change the final

これはとにかく正規表現を書く方法ですが、好奇心から、正規表現をそのままにして行アンカーを追加するとどうなりますか?

(?m)^(?:.+) \[.+?\] (.+) \[.+?\] logged in (?:.+)$

それでもひどく非効率的ですが、うまくいかないかうまくいかないかの違いになるかもしれません。:D

于 2011-07-11T09:24:22.550 に答える