所以,我有一个正在使用Rubular和CLI(使用pry
gem)测试的正则表达式。这解析了自定义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
答案 0 :(得分: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都会为上述测试返回相同的结果。