質問: テキストベースのログ解析(fluentd)をやっており、机上検討にてはgrepで正規表現の検討をしているのですが、 ゆくゆくはfluentd登録をする上で処理方式の違いを確認しておりました。 1の場合は処理A 2の場合は処理B いずれでもない場合は処理C ※処理Cには文字列が何も含まれないケースも想定されます。 この場合、awkやsedなら「.*」で処理Cを救えると考えているのですが、(この時点で間違っていたらすみません) rubyでもどうようの条件でしょうか?いくつかの参考サイトも調べたのですが、余計に頭が混乱してしまいました。。 すみませんが、よろしくお願いいたします。
回答: 「あらゆるものにマッチする正規表現」についてだけ回答します。(fluentd については知らないので「いずれでもない場合は〜」を表現するのに「あらゆるものにマッチする正規表現」を用いるのが適切かどうかはわかりません) Ruby においてもそれは `.*` も該当しますが、それ以外には `^` や空文字列 (これも正規表現の一つ) が考えられます。正規表現エンジンやそれを利用する処理系にも依存しますが、一般的にはこの中で一番効率がいいのは空文字列、次に `^`、最も効率が悪いのは `.*` です。 Ruby なら以下を実行してみるとわかると思います。(環境によりますが数分かかると思います) ``` #!/bin/sh time ruby -e 'x="foo"; 1000000000.times {x=~//}' time ruby -e 'x="foo"; 1000000000.times {x=~/^/}' time ruby -e 'x="foo"; 1000000000.times {x=~/.*/}' ``` ちなみに `sed`(1) だと `.*` はほかのと比較して猛烈に遅いですし、空文字列を指定する方法はないようです。(`\(\)` が該当すると言えるかもしれないが、これも `^` より遅い。GNU sed 調べ)