我正在使用正则表达式处理日志处理器,并且在解析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或更多次出现可以更好地量化。