用户代理字符串的日志处理正则表达式

时间:2017-08-17 06:23:32

标签: regex

我正在使用正则表达式处理日志处理器,我在解析UserAgent字符串时遇到一些问题,因为通常的分隔符是逗号(,)。

以下是一个示例行: UserName:abc,UserAgent:Mozilla / 5.0(X11; Linux x86_64)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 58.0.3029.81 Safari / 537.36,客户端:Chrome

我正在尝试实现与以下内容相匹配的内容: ([^:] +):\ s(\ w +)\,\ s([^:] +):\ s(不等于序列中的\,\ s \ Client)\,\ sClient:\ s( \ w +)

如何实现“不等于序列中的\,\ s \ Client”,以便捕获整个用户代理字符串。用户代理字符串将以所有格式出现,因此我认为这是执行此操作的最佳方式。

感谢。

1 个答案:

答案 0 :(得分:0)

看看你的字符串是什么样的:

UserName: abc, UserAgent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36, Client: Chrome
|-- 1 --| |2|  |-- 3  --| |-------------------------------------------- 4 -------------------------------------------------------|          |-- 5--|

您需要匹配的组就在, Client:子字符串之前。所以,你甚至不需要一个复杂的构造(例如"tempered greedy token"),只需要(.*?)就可以了(因为它会匹配任何0+字符,尽可能少到后续的第一次出现)子模式)。

您的正则表达式可以修改为

([^:]+):\s*(\w+),\s*([^:]+):\s*(.*?),\s*Client:\s*(\w+)
                               ^^^^^

请参阅regex demo

注意我删除了不必要的转义(因为:,不是特殊正则表达式的特殊构造时的特殊正则表达式元数据)\s可以用*更好地量化 - 出现0次或更多次。