You need to enable JavaScript to run this app. 如何使用正则模式替换字符串词汇并设置例外匹配规则
优惠活动
大模型
产品
解决方案
定价
更多

如何使用正则模式替换字符串词汇并设置例外匹配规则

问题原因

你写的负向预查(?!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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 10:36:03