RegExp lookahead前瞻(?=、?!)使用问题:匹配含investing和news的链接逻辑错误
负向正则的错误原因
你写的/(?!.*investing)(?!.*news)/的逻辑是两个关键词都不存在才匹配,和你需要的「两个关键词没有同时存在」逻辑完全不符:
- 逻辑上「同时包含A和B」的否定是「缺少A 或者 缺少B」,不是「既缺A又缺B」
- 你写的负向正则是两个负向预查并列,属于逻辑与关系,要求两个条件同时满足:既不能存在
investing,也不能存在news,所以只缺其中一个关键词的链接(比如有investing没news,或者有news没investing)都不会被这个正则匹配,不符合你的预期。
正确的负向正则写法
如果要写和!positiveTest(x)完全等价的正则,有两种实现方式:
写法1:直接否定正向匹配的整体逻辑
const correctNegativeTest = x => /(?!(?=.*investing)(?=.*news))/.test(x)
逻辑为:不满足「同时存在两个关键词」的情况就匹配,完全符合你要的校验规则。
写法2:按“或”逻辑拆分负向条件
const correctNegativeTest = x => /(?!.*investing)|(?!.*news)/.test(x)
逻辑为「没有investing 或者 没有news」,和「不同时存在两个关键词」等价,也能达到预期效果。
测试结果验证
用你给出的三个测试链接验证的话,返回结果符合预期:
https://br.investing.com/news/:同时有两个关键词,负向测试返回falsehttps://br.investing.com/nws/:只有investing,负向测试返回truehttps://br.inveting.com/news/:只有news,负向测试返回true
内容的提问来源于stack exchange,提问作者user17386646
相关产品推荐
相关产品推荐

