LoginSignup
3

More than 5 years have passed since last update.

【Ruby on Rails】「正規表現でマッチするものを取得」したい。

Last updated at Posted at 2016-11-18

「正規表現でマッチするものを取得したい。」

  • ログから必要な部分だけ抜き出したい...
  • けど正規表現で一気に書くのって面倒臭い...

<例> /([\d.]+) - - [([^]]+)] "[A-Z]+ .*.+ HTTP\/[\d.]+" (\d+) .+ \d+ "[^""]+" "[^""]+"/

こんな暗号どうやって紐解けばいいんだよ...

って事で始めるよ

【手順①】欲しい部分をピックアップ

sample.log
127.0.0.1 - - [18/Nov/2016:10:20:30 +0900] "GET /dummy/aaa/ HTTP/1.1" 200 12345 67890 "-" "Java/1.7.0_79"
~~~~~~~~~     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~                            ~~~
  └>IPアドレス      └>日時                                           └>ステータスコード

こんなログがあるとして、
その中から今回は「IPアドレス」「日時」「ステータスコード」を取得してくる事とします。

【手順②】欲しい数だけ () を用意

reg.rb
/() () ()/

今回は3つなのでこんな感じ。

【手順③】 () の中や外に正規表現を書いていく

reg.rb
/([\d\.]+) \- \- \[([^\]]+)\] "[A-Z]+ .*.+ HTTP\/[\d\.]+" (\d+) .+ \d+ "[^""]+" "[^""]+"/
#~~~~~~~~~        ~~~~~~~~~~                             ~~~~~~~
  • Point
    • 欲しいところは()で括る
    • 要らないところも正規表現で書く

【手順④】動作確認

reg.rb
log = '127.0.0.1 - - [18/Nov/2016:10:20:30 +0900] "GET /dummy/aaa/ HTTP/1.1" 200 12345 67890 "-" "Java/1.7.0_79"'

if str = log.match(/\A([\d\.]+) \- \- \[([^\]]+)\] "[A-Z]+ .*.+ HTTP\/[\d\.]+" (\d+) .+ \d+ "[^""]+" "[^""]+"/)
  puts str[1]  # => 127.0.0.1
  puts str[2]  # => 18/Nov/2016:10:20:30 +0900
  puts str[3]  # => 200
end

実際に動かして、取得できるか見てみよう。



以上

【補足①】

正規表現が正しいのか、どうなってるのか分からない時はこれを使おう。
 https://regexper.com/
可視化してくれるからオススメです。是非。

【補足② 2017/02/20】

プログラム言語によって、使用されている正規表現エンジンが異なります。
Rubyの場合は上記で上手くいくけど、他の言語だと上手くいかない事もあるので、注意しよう!!!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3