2017-08-17 6 views
1

正規表現を使用してログ処理を行っていますが、通常の区切り文字はコンマ(、)なので、UserAgent文字列を解析する際に問題があります。ユーザエージェント文字列用の正規表現ログ

ここではサンプルラインです: ユーザー名:ABC、UserAgentの:Mozillaの/ 5.0(X11; Linuxのx86_64で)のAppleWebKit/537.36(ヤモリのようにKHTML、)クローム/ 58.0.3029.81サファリ/ 537.36、クライアント:クローム

は、 ([^:] +):\ s(\ w +)\、\ s([^:] +):\ s(\、\ s \と同じではない)を達成しようとしています。クライアントは、シーケンス全体で\、\ s \ Clientと等しくないようにすることで、ユーザーエージェントの文字列全体をキャプチャすることができます。ユーザーエージェントの文字列はすべての形式で入力されるので、これを行うには最良の方法だとわかりました。

ありがとうございました。あなたの文字列がどのように見えるかで

+0

あなたがしたいことを私たちに教えてください。数行を与えて、期待される出力を表示します。 –

+1

私はちょうど '(。*?)'が必要だと思う - https://regex101.com/r/PgaZu4/1を参照してください –

答えて

0

ルック:

UserName: abc, UserAgent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36, Client: Chrome 
|-- 1 --| |2| |-- 3 --| |-------------------------------------------- 4 -------------------------------------------------------|   |-- 5--| 

あなたが一致する必要があるグループを右, Client:ストリングの前にあります。したがって、ここでは複雑な構造(たとえば"tempered greedy token")を必要とせず、(.*?)だけが実行されます(可能な限り0以上の文字に続くサブパターンが最初に出現するまで一致します)。

あなたの正規表現は、(,はない特殊な正規表現のメタ文字をある:として、彼らは特殊な構造の一部ではない場合)と\s私は不必要なエスケープを削除regex demo

注を参照してください

([^:]+):\s*(\w+),\s*([^:]+):\s*(.*?),\s*Client:\s*(\w+) 
           ^^^^^ 

のように変形することができます* - 0回以上の出現により良好に定量化される。

+0

ありがとうウィクショー、これは素晴らしい作品です。私はあまりおなじみではない?オペレーター。しかし、このように使用すると、自動的にその間にあるものと一致するように見えます。 これが当てはまる場合、これは同じように機能しません。 \ s *(\ w +)、\ s *([^:] +):\ s *(。*)、\ s *クライアント:\ s *(\ w +) – Jckx

+0

@ Jckx:はい、開始区切り文字の左端の出現から最後の区切り文字までの2つの文字列の間には何も一致しません。あなたの入力で '。*'と同じように動作するかもしれませんが、 '。*'は終わりの区切り文字の右端に一致します。 –

+0

他にも例がある場合は、質問に追加して '。*? 'にどのような問題があるのか​​を確認してください。 –