正则表达式优化:匹配URL并排除含指定关键词的链接
排除含指定关键词的URL并替换其余URL的正则优化
需求是替换文本中所有URL,但排除包含"word"关键词的URL。尝试了正则(?!word)(?:https?:\/\/)?(?:[a-zA-Z0-9.]+)\.(?:[a-zA-Z]{2,3}),但无法正确排除目标URL。
测试代码
const text = `This is a sample text with links: www.example.com, https://www.hello.com, http://www.google.com, https://word.com, http://word.com www.word.com https://www.site.frs www.word.com asasd.cds qdwdew.www asd.cdd sdsd https://www.word.com https://www.word.frs some text hello word https www.example.wfd asdasd wwwsds.dsad.word.com `; const regex = /(?!word)(?:https?:\/\/)?(?:[a-zA-Z0-9.]+)\.(?:[a-zA-Z]{2,3})/gm; const matches = text.replace(regex, '[xxx]'); console.log(matches);
当前错误结果
This is a sample text with links: [xxx], [xxx], [xxx], [xxx], [xxx] [xxx] [xxx] [xxx] [xxx] [xxx] [xxx] sdsd [xxx] [xxx] some text hello word https [xxx] asdasd [xxx]
期望结果
This is a sample text with links: [xxx], https://www.hello.com, [xxx], https://word.com, http://word.com www.word.com [xxx] www.word.com asasd.cds qdwdew.www asd.cdd sdsd https://www.word.com https://www.word.frs some text hello word https [xxx] asdasd wwwsds.dsad.word.com
解决方案
原正则的问题在于负向前瞻(?!word)的位置错误,它仅检查当前位置后是否不是"word",无法覆盖整个URL范围。需要用负向环视确保整个匹配的URL字符串中不包含"word",同时调整正则结构以匹配完整的URL片段。
修正后的正则
const regex = /\b(?!\S*word)(?:https?:\/\/)?[a-zA-Z0-9.]+\.[a-zA-Z]{2,}\b/gm;
正则解释
\b:单词边界,确保匹配独立的URL片段(?!\S*word):负向前瞻,检查当前匹配的非空白字符序列中不包含"word"(?:https?:\/\/)?:可选的HTTP/HTTPS协议头[a-zA-Z0-9.]+:匹配域名主体部分\.[a-zA-Z]{2,}:匹配域名后缀(支持2个以上字符,如.frs)
修改后的完整代码
const text = `This is a sample text with links: www.example.com, https://www.hello.com, http://www.google.com, https://word.com, http://word.com www.word.com https://www.site.frs www.word.com asasd.cds qdwdew.www asd.cdd sdsd https://www.word.com https://www.word.frs some text hello word https www.example.wfd asdasd wwwsds.dsad.word.com `; const regex = /\b(?!\S*word)(?:https?:\/\/)?[a-zA-Z0-9.]+\.[a-zA-Z]{2,}\b/gm; const matches = text.replace(regex, '[xxx]'); console.log(matches);
运行后即可得到符合预期的替换结果。
内容的提问来源于stack exchange,提问作者Zuxriddin Kamalov
相关产品推荐
相关产品推荐

