用java正则表达式解析apache日志文件

用java正则表达式解析apache日志文件,java,regex,apache,logging,Java,Regex,Apache,Logging,我试图解析一个apache日志文件,它使用以下模式运行良好: ^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"([^\"]+)\"[\\W]+ 但是,它会与以下日志断开: 218.30.103.62 - - [17/May/2015:11:05:11 +0000] "GET /robots.txt HTTP/1.1" 200 - "-" "Sogo

我试图解析一个apache日志文件,它使用以下模式运行良好:

^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"([^\"]+)\"[\\W]+
但是,它会与以下日志断开:

218.30.103.62 - - [17/May/2015:11:05:11 +0000] "GET /robots.txt HTTP/1.1" 200 - "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"\
我对正则表达式并没有真正的经验,我几乎是在尝试一种错误和尝试的方法,任何帮助都将不胜感激。(我知道d+不应该在那里,但我知道的几乎就是这个…)

有什么想法吗? 谢谢

您的格式是:

"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
(见附件)

因此,您的正则表达式将是:

"^(\\S+) (\\S+) (\\S+) \\[(.+?)\\] \\\"(.+?)\\\" (\\d{3}) (\\S+) \\\"(.+?)\\\" \\\"(.+?)\\\"[\\W]+ $"
匹配组的位置(我使用apache文档中定义的引用):

  • %h
  • %l
  • %u
  • %t(不包括
    []
  • %r
  • %>
  • %b
  • %{Referer}i
  • %{用户代理}i

  • 注意-您的正则表达式有点过于复杂,失败的原因是%b并不总是一个数字-当请求不返回任何字节时,它将是
    -
    而不是
    0

    您说的“它中断”是什么意思?你想达到什么目标?“解析日志文件”实际上没有任何意义。您是想从每一行提取一些特定的信息还是什么?在
    \d{3}
    之后,您有
    (\d+)
    ,将其替换为
    (\d+)
    。请参见。您可以将
    [^\\s]+
    缩短为
    \\s+
    @oriberu您是对的,似乎是我睡觉的时间了:D