2011-07-11 14 views
0

です。CocoaアプリケーションでRKLを使用して、ラップされたタスクのログステートメントを解析しています。RegexKitLiteが一致していない、Perlでサポートされているチェッカーは

パターン:

(?:.+) \[.+?\] (.+) \[.+?\] 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 

すべての正規表現テスターが正常に三行目とキャプチャ 'mikeyward' にマッチします。 searchStringのが有効であり、サンプルデータが含まれ、RKLはラインと一致しないことを保証する、ましてやユーザー名をキャプチャするためにチェックしたにも関わらず :

Objective-Cのコード:

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

問題。上記の例では、キャプチャ配列にゼロオブジェクトが返され、エラーチェックが行われないため例外がスローされます:)

正規表現チェッカーがマッチとキャプチャを確認してもRKLが間違っている理由を理解する助けとなります非常に高く評価。

ありがとう〜

答えて

0

あなたのマッチャーは1行のマッチングしか行いません。オプション付きのバージョンを使用して渡すRKLMultiline

+0

マルチラインモードは、ラインアンカー( '^'と '$')の動作にのみ影響し、それらは使用していません。 –

0

問題がthis oneに関連しているか、catastrophic backtrackingの場合があります。私のアドバイスはどちらの場合も同じです:定量語のどれも重複しないように正規表現を書いてください。例えば:あなたの正規表現で

(?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

関連する問題