【问题标题】:Regular expression to parse combined log with strange user agent string用奇怪的用户代理字符串解析组合日志的正则表达式
【发布时间】:2014-02-28 10:58:28
【问题描述】:

我使用下面的正则表达式来解析组合日志格式:-

^(?P<client>\S+) (?P<identd>\S+) (?P<userid>\S+) \[(?P<datetime>[^\]]+)\] "(?P<method>[A-Z]+) (?P<request>[^ "]+)? (?P<version>HTTP/[0-9.]+)" (?P<status>[0-9]{3}) (?P<size>[0-9]+|-) "(?P<referrer>[^"]*)" "{1,3}(?P<useragent>[^"]*)"{1,3} "(?P<cookie>[^"]*)"

它适用于大多数日志,但随着时间的推移,有很多用户代理有奇怪的“内部导致正则表达式失败。我在下面复制了一些有问题的用户代理。很高兴有人可以帮助修复我的正则表达式,以便它也适用于以下奇怪的场景:-

"Mozilla/5.0 (Linux; U; Android 4.1.1; tr-tr; PIRANHA BUSINESS TAB 7"" Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) 版本/4.0 Safari/534.30 GSA/2.0。 0.392829"

"Mozilla/4.0 (兼容; MSIE 8.0; 视窗 NT 5.1;三叉戟/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; xhcueef7$#$% fjidf87jcnuFfFJH6@@jjfidjcu%09348%""=""IEAK)"

【问题讨论】:

    标签: regex


    【解决方案1】:

    看起来引号是用引号转义的。即

    如果" 字符后面紧跟另一个",则应将其视为单个" 作为用户代理的值。

    尝试改变这个:

    "{1,3}(?P<useragent>[^"]*)"{1,3}
    

    到这里:

    "(?P<useragent>(?:[^"]""|[^"])*)"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2013-05-04
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多