如何编写正则表达式匹配不包含多个指定单词的文本?
如何用正则在Chrome网络面板中排除多个关键词
嘿,我太懂这种“单个正则好用,组合就翻车”的挫败感了!咱们一步步拆解,搞清楚怎么写出正确的多关键词排除正则。
先搞懂单个排除的原理
你之前用的^((?!badword).)*$核心是负前瞻断言,它的逻辑是:
从字符串开头到结尾,每一个字符的位置都要满足「后面不会出现
badword这个序列」。
这样整个URL里就绝对不会包含badword,完美实现单个关键词的排除。
为什么直接加管道符会失效?
你尝试用|(或逻辑)组合时,大概率是写错了结构——比如写成^((?!css|gif).)*$或者更简单的^(?!css|gif).*$,这两种写法都会出问题:
- 后者
^(?!css|gif).*$只检查URL开头是不是css或gif,如果URL中间出现(比如foo.css),还是会被匹配到,导致漏排除; - 前者
^((?!css|gif).)*$理论上和正确写法等价,但可能你没开启Chrome的正则模式,或者测试的URL有特殊情况(比如大小写?不过Chrome网络面板过滤默认是不区分大小写的)。
正确的多排除正则写法
要同时排除多个关键词,需要给每个关键词单独加负前瞻,用逻辑与的方式叠在一起:
^((?!css)(?!gif).)*$
它的逻辑是:
整个URL的每一个位置,都要同时满足「后面不会出现
css」并且「后面不会出现gif」。
这样只要URL里包含css或gif任意一个,整个正则就不匹配,实现精准排除。
在Chrome网络面板里的正确用法
- 打开Chrome开发者工具的「网络」面板;
- 点击过滤框右侧的
.*按钮,开启正则表达式匹配模式(这步很重要!默认是普通字符串匹配,正则会失效); - 把上面的正则粘贴到过滤框里,回车即可。
这样就能自动隐藏所有包含css或gif的请求,保留JS、PNG等其他资源啦。
内容的提问来源于stack exchange,提问作者Konrad Viltersten




