如何修改正则表达式让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
相关产品推荐
相关产品推荐

