

テキストベースのログ解析(fluentd)をやっており、机上検討にてはgrepで正規表現の検討をしているのですが、  
ゆくゆくはfluentd登録をする上で処理方式の違いを確認しておりました。

①の場合は処理A  
②の場合は処理B  
いずれでもない場合は処理C  
※処理Cには文字列が何も含まれないケースも想定されます。

この場合、awkやsedなら「.*」で処理Cを救えると考えているのですが、(この時点で間違っていたらすみません)  
rubyでもどうようの条件でしょうか？いくつかの参考サイトも調べたのですが、余計に頭が混乱してしまいました。。

すみませんが、よろしくお願いいたします。


CC BY-SA 4.0
2020-04-30T13:59:19.480
66157
2020-05-02T02:08:42.697
2020-05-02T02:08:42.697
19110
39906
question
ruby 正規表現 fluentd grep
awk/sed/grepとruby(fluentd)における正規表現「.*」の扱い


「あらゆるものにマッチする正規表現」についてだけ回答します。(fluentd
については知らないので「いずれでもない場合は〜」を表現するのに「あらゆるものにマッチする正規表現」を用いるのが適切かどうかはわかりません)

Ruby においてもそれは `.*` も該当しますが、それ以外には `^` や空文字列 (これも正規表現の一つ)
が考えられます。正規表現エンジンやそれを利用する処理系にも依存しますが、一般的にはこの中で一番効率がいいのは空文字列、次に `^`、最も効率が悪いのは
`.*` です。

Ruby なら以下を実行してみるとわかると思います。(環境によりますが数分かかると思います)

[code]

    #!/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=~/.*/}'
    
[/code]

ちなみに `sed`(1) だと `.*` はほかのと比較して猛烈に遅いですし、空文字列を指定する方法はないようです。(`\(\)`
が該当すると言えるかもしれないが、これも `^` より遅い。GNU sed 調べ)


CC BY-SA 4.0
2020-05-01T13:07:00.403
66184
2020-05-01T13:07:00.403
3061
66157
answer