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 回答