如何使用正则模式替换字符串词汇并设置例外匹配规则
问题原因
你写的负向预查(?!google)只校验当前位置向后的字符是否为google,但你把它放在正则最开头时,只会校验域名第一个字符后的内容:比如匹配google.com时,第一个字符g向后是oogle不满足google,负向预查会通过,正则会从第二个字符o开始匹配后续内容,所以才出现只忽略首字母的问题。
另外你原来的正则里.没有转义,会匹配任意字符而非仅匹配点号,属于隐藏bug。
方案1:直接调整正则模式
你可以在负向预查前加单词边界,同时完整匹配例外域名,调整后正则如下:
\b(?!google\.com)[a-zA-Z0-9]+\.?(com|net)\b
对应JS代码修改为:
const formatString = (str) => { // 字符串构造RegExp需要双写反斜杠转义 const regex = new RegExp("\\b(?!google\\.com)[a-zA-Z0-9]+\\.?(com|net)\\b","gi"); return str.replace(regex, "*") }
测试用例运行结果符合预期:formatString("google.com something else.net") → "google.com something *"
方案2:使用replace回调(更适合多例外场景)
如果后续需要加多个例外规则,硬写正则会越来越难维护,推荐直接匹配所有域名后在回调里判断是否为例外:
const formatString = (str) => { // 例外列表可随意扩展,不区分大小写匹配 const exceptions = ['google.com', 'example.net']; const regex = new RegExp("\\b[a-zA-Z0-9]+\\.?(com|net)\\b","gi"); return str.replace(regex, (match) => { return exceptions.includes(match.toLowerCase()) ? match : '*' }) }
这个方案无需频繁调整正则,加新例外直接往exceptions数组里加即可。
内容的提问来源于stack exchange,提问作者stoner
相关产品推荐
相关产品推荐

