【发布时间】:2014-07-11 10:03:57
【问题描述】:
我有大型日志文件,其中我得到一个包含用户代理的字段。现在该字段的位置可能因日志而异,我正在尝试按原样提取完整的用户代理字符串。 到目前为止,我尝试过的正则表达式选项不适用于我在这些日志中获得的所有用户代理。他们似乎为他们中的大多数人工作。
以下是我在日志中获取的一些示例用户代理
"field1" "field2" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.65 Safari/535.11"
"field1" "Sundance(Compatible; Windows; U; en-US;) 版本/0.9.0.38" "field2" "field3"
"yacybot (i386 Linux 2.6.24-24-generic; java 1.6.0_07; Europe/en)http://yacy.net/bot.html" "field1" "field2"
“field1”“field2”“Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7m”
我使用的正则表达式(不适用于所有人)如下
([^/\s]*)(/([^\s]*))?(\s*\[[a-zA-Z][a-zA-Z]\])?\s*(\((([^()]|(\([^()]*\)))*)\))?\s*
原始日志是用引号括起来的空格分隔字段(类似于 squid 日志),因此我可以确定每个日志行中用户代理字符串的开头和结尾。但是每个日志文件中字段的位置不同。
如果我能在改进这个正则表达式模式方面得到一些帮助,那将是最好的。我需要的是正则表达式能够匹配我列出的所有上述用户代理字符串。
任何帮助将不胜感激。
编辑
我想要实现的是我需要从不同的日志文件中提取包含用户代理字符串的字段。日志文件包含一系列以空格分隔并用引号括起来的字段。
【问题讨论】:
-
@jonrsharpe 我从来没有要求你成为一个正则表达式写作服务或图书馆推荐的提供者。我说我写了一个需要更多改进的正则表达式。不,没有任何相关问题有助于我发布自己的问题。
-
“如果有人可以将我引导到任何第三方库”...此外,提供比 “不适用于所有他们”(你期待什么,你得到了什么?)
-
我期待我共享的正则表达式能够捕获所有用户代理。但是有一些例外情况,这个正则表达式似乎失败了。我已经在帖子中分享了例外情况。
-
所有字段作为字符串:field1、field2 或 field3 与用户代理字符串有什么区别?用户代理字符串是唯一包含空格的吗?这将是一个真正的特征。
-
"only the user agent string contains blanks" 但这并没有多大帮助,因为它并没有消除用户代理不包含空格的可能性。如果所有用户代理都包含空白并且没有其他字段包含空白,那么它就像查找所有 "[^\s]*"|"(.*)" 匹配项并仅保留具有捕获组的匹配项一样简单:debuggex.com/r/mEHs1VRgGrJETyKI