You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改正则表达式让Apache日志Referer捕获组排除特定单词?

修改正则表达式以排除包含特定单词的Referer

首先,先梳理下你的需求场景:你有一段Apache日志内容:

18.123.117.10 287.153.14.123 [08/Jan/2020:10:16:22 +0000] "GET /sport/home HTTP/1.1" 200 12345 122 "https://www.google.com" "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" eb72d10e0-3f9f-42kf-3di6-ff40hegg49f85 1578478582510 1578478582612

你原本用正则 ^(?:[^"\n]*"){3}(?<referer>[^"?]+) 提取Referer字段,但现在需要让referer捕获组仅匹配不包含特定单词(比如google)的内容,对吧?

解决方案:添加负向先行断言

你可以在捕获组内部加入负向先行断言来实现过滤逻辑,修改后的正则如下:

^(?:[^"\n]*"){3}(?<referer>(?!.*google)[^"?]+)

关键修改点拆解:

  • (?!.*google):这是实现过滤的核心,属于负向先行断言。它会检查当前位置之后的内容中不存在google字符串,.*用来匹配任意数量的任意字符(除换行),确保不管google出现在Referer的哪个位置都会被检测到。
  • [^"?]+:保留你原本的匹配逻辑,只提取到"或?为止的内容,保证Referer字段的完整性。

效果验证:

  • 对于日志中的"https://www.google.com",这个正则不会捕获它,因为内容中包含google。
  • 如果Referer是"https://www.example.com/page"这类不包含目标单词的内容,正则会正常捕获到https://www.example.com/page。

如果需要排除多个单词(比如同时过滤google和baidu),可以把断言部分改成(?!.*(google|baidu)),这样就能同时排除包含任意一个目标单词的Referer了。

内容的提问来源于stack exchange,提问作者paulalexandru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:47:45