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



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

下面是一个示例行: 用户名: abc, 用户代理: Mozilla/5.0 (X11;Linux x86_64( AppleWebKit/537.36 (KHTML, like Gecko( Chrome/58.0.3029.81 Safari/537.36, 客户端: Chrome

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

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

谢谢。

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

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:子字符串之前。因此,您甚至不需要在这里使用复杂的构造(例如"缓和贪婪令牌"(,只需(.*?)就可以了(因为它将尽可能少地匹配任何 0+ 字符,直到后续子模式的第一次出现(。

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

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

查看正则表达式演示

注意我删除了不必要的转义(因为:,不是特殊构造的一部分时不是特殊的正则表达式元字符(,并且s通过*- 0或更多次出现可以更好地量化。

最新更新