2017-02-23 17 views
0

サーバから次のログメッセージがあり、以下のメッセージから正規表現パターンを特定しようとしています。サーバログの正規表現パターン

2015-10-01T03:14:49.000-07:00 lvn-d1-dev DevServer[9876]: INFO: [EVENT][SEQ=248717] 2015:10:01:03:14:49 101 [email protected] ip_address=1.1.1.1 service_id=IP1234-NPB12345_00 result=RESULT_SUCCESconsole_id=0000000138e91b4e58236bf32besdafasdfasdfasdfsadf account_id=11111 platform=pik 

私は、次の正規表現パターン上記の正規表現パターンを使用して

.+\[SEQ=\w+\]\s*(\d+:[\d\d:]+)\s(\d+)\s*.+\=(.+) 

を使用している、私は日付(2015:10:01:03:14:49)を単離することができるよとID( 101)、電子メール([email protected])とサービスIDを別々に取得することはできません。

私の正規表現のパターン文字列では、 '\ ='は最後の '='マッチを指しています。私はここに何かを逃していますか親切な形で正規表現のパターンを識別するのを手伝ってください。

答えて

0

あなたの正規表現の最後に問題があります:.+\=(.+)

+は可能な限り多くの文字に一致し、必要に応じて返されます(欲張り)。

.+は、それが、最大のポイント\=(.+)までもはや満足できない可能性ができた文字のすべてにマッチました。それが最後の等号と一致した理由です。代わりに、ただの等号の検索

、これを試してみてください。

.*\[SEQ=\d+\] (\d+:[\d:]+) (\d+) sign-in_id=(\S+) .* service_id=(\S+)

IDがはるかに良い作品名で一致しています。

1

正規表現はデフォルトで貪欲です。だから、.+\=は、残りの文字列全体と最後の=までマッチしました。

代わりに、貪欲でないバージョン:.+?\= - ?にご注意ください。

完全なバージョンは、次のようになります。あなたは物事をovercomplicateべきではありません。また

.+\[SEQ=\w+\]\s*(\d+:[\d\d:]+)\s(\d+)\s*(.+?)\=(.+) 

を。 @InternetUnexplorers answerで既に指摘したように、マッチングを簡単にするために、必要な値に関連付けられた名前をアンカーとして使用する必要があります。名前が何も繰り返されていない限り、

.+\[SEQ=\w+\]\s*(\d+:[\d\d:]+)\s(\d+)\s*sign-in_id\=(.+) 

となります。