我正在使用正则表达式处理日志处理器,我在解析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”,以便捕获整个用户代理字符串。用户代理字符串将以所有格式出现,因此我认为这是执行此操作的最佳方式。
感谢。
答案 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次或更多次。