0

したがって、RubularとCLIから(prygemを使用して)テストした正規表現があります。これにより、カスタムApacheログ形式が解析されます。pryで入力をフィードすると、期待どおりに機能します(たとえば、入力され$~ます)。Rubularは、さまざまな入力行の正しい一致とグループ化も報告します。以下のコードから実行すると、一致するものはありません。

String.chomp!試合を延期した場合に備えて、キャラクターをいじってみ\nましたが、さまざまな順列は効果がありません。

それは、より経験豊富なRubyistが光を当てることができるものだと確信しています。

Rubularリンク:http ://www.rubular.com/r/fycHVYZdZz

関連するコード、正規表現、入力は次のとおりです。よろしくお願いします。

log_regex = %r{
            (?<ip>(([0-9]{1,3}\.){3}[0-9]{1,3}))                                                                   
            \s-\s
            (?<src_ip>.*)
            -\s
            (?<date>\[.*\])
            \s
            (?<url>".+")
            \s
            (?<response>\d{3})
            \s
            (?<length>\d+)
            \s
            (?<referer>".+")
            \s
            (?<useragent>".*")
            \s(?<host>.*)?
            /ix
            }

logfile = ARGV[0]

def process_log(log_regex,logfile)
    IO.foreach(logfile, 'r') do |line|
        line.chomp!
        log_regex.match(line) do |m|
            puts m['ip']
        end
    end
end

process_log(log_regex,logfile)

サンプル入力:

209.123.123.123 - - [05/Jul/2012:11:02:01 -0700] "GET /url/mma/rss2.0.xml HTTP/1.1" 301 0 "-" "FeedBurner/1.0 (http://www.FeedBurner.com)" xml.somewhere.com
4

1 に答える 1

2

おそらく、正規表現の定義を詳しく調べたいと思うでしょう。フラグは%r、それらが属する場所の終了に従うのではなく、パターンの定義内にあります。

%r{
...
/ix
}

する必要があります:

%r{
...
}ix

IRBから:

irb(main):001:0> %r{foo/ix}
/foo\/ix/
irb(main):002:0> %r{foo}ix
/foo/ix
irb(main):003:0> %r{^foo$}ix =~ 'foo'
0
irb(main):004:0> %r{^foo/ix$} =~ 'foo'
nil

PRYとIRBはどちらも、上記のテストで同じ結果を返します。

于 2012-07-09T19:09:38.750 に答える