我使用下面的正则表达式来解析组合日志格式: -
^(?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>[^"]*)"
它可以找到大多数日志,但随着时间的推移,有很多useragent有奇怪的“里面使正则表达式失败。我复制了下面的一些有问题的用户代理。很高兴,如果有人可以帮助解决我的正则表达式,以便它也适用于以下奇怪的场景: -
“Mozilla / 5.0(Linux; U; Android 4.1.1; tr-tr; PIRANHA BUSINESS TAB 7”“Build / JRO03C)AppleWebKit / 534.30(KHTML,类似Gecko)版本/ 4.0 Safari / 534.30 GSA / 2.0。 0.392829"
“Mozilla / 4.0(兼容; MSIE 8.0; Windows NT 5.1;三叉戟/ 4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; xhcueef7 $#$% fjidf87jcnuFfFJH6 @@ jjfidjcu%09348% “”= “” IEAK)“
答案 0 :(得分:0)
看起来报价用引号转义。即。
如果"
字符后面紧跟另一个"
字符,则该字符应被视为用户代理值的单个"
。
尝试更改此内容:
"{1,3}(?P<useragent>[^"]*)"{1,3}
对此:
"(?P<useragent>(?:[^"]""|[^"])*)"