【问题标题】:Log Processing Regex for User-Agent Strings用户代理字符串的日志处理正则表达式
【发布时间】:2017-08-17 06:23:32
【问题描述】:

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

这是一个示例行: 用户名:abc,用户代理: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 in a sequence”以便捕获整个用户代理字符串。用户代理字符串将以所有格式出现,所以我认为这是最好的方法。

谢谢。

【问题讨论】:

  • 请告诉我们你想做什么。给出几行,然后显示预期的输出。
  • 我认为你只需要(.*?) - 见regex101.com/r/PgaZu4/1

标签: regex


【解决方案1】:

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

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 次或更多次。

【讨论】:

  • 感谢 Wiktor,这很好用。我不是很熟悉?操作员。但看起来当以这种方式使用时,它会自动匹配介于两者之间的任何内容。如果是这种情况,这也会以同样的方式工作,不是吗? ([^:]+):\s*(\w+),\s*([^:]+):\s*(.*),\s*客户端:\s*(\w+)
  • @Jckx:是的,它匹配两个字符串之间的任何内容,从最左边的起始分隔符到最左边的结束分隔符。对于您的输入,它可能与 .* 的工作方式相同,但 .* 匹配到最右边的结束分隔符。
  • 如果您有其他示例,请将它们添加到问题中,看看您对.*? 有什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
相关资源
最近更新 更多