JavaScript高效替换随机字符串中相邻重复短语的方法
解决相邻重复短语替换问题
原代码的问题
你的正则表达式/(\b\w+\b)\s+\1/g存在三个关键缺陷:
- 仅匹配单个单词且空格分隔的重复,无法处理无空格直接拼接的重复(如
FounderFounder) \w+只能匹配字母、数字和下划线,无法覆盖包含空格、连字符、特殊符号的完整短语(如2015 - Present · 8 yrs)- 单词边界
\b在包含非单词字符的短语中会失效,导致匹配完全失败
修正方案
调整正则表达式,同时支持无空格拼接和空格分隔的相邻重复短语匹配,并兼容包含特殊符号的短语:
function replaceDuplicateSubstrings(string) { // 匹配两种相邻重复场景:直接拼接的重复 / 空格分隔的重复 // 非贪婪捕获避免过度匹配,确保精准定位重复短语 const regex = /(.+?)(?:\s+)?\1/g; return string.replace(regex, "$1 |"); } // 测试示例 const exampleString = "FounderFounder Breakthrough Energy Breakthrough Energy 2015 - Present · 8 yrs2015 - Present · 8 yrs"; console.log(replaceDuplicateSubstrings(exampleString)); // 输出:"Founder | Breakthrough Energy | 2015 - Present · 8 yrs |"
正则说明
(.+?):非贪婪捕获任意字符(至少1个),精准定位需要匹配的原短语(?:\s+)?:可选非捕获组,匹配0或多个空格,兼容有空格分隔的重复场景\1:反向引用捕获组内容,匹配与原短语完全相同的重复部分/g:全局模式,替换所有符合条件的重复内容
优化建议
如果需要限制匹配的字符范围(避免误匹配部分重复的零散字符),可以将捕获组调整为更具体的规则,比如针对示例中的字符类型:
// 仅匹配包含字母、数字、空格、连字符、中间点的短语 const regex = /([\w\s\-·]+?)(?:\s+)?\1/g;
内容的提问来源于stack exchange,提问作者spr3dge
相关产品推荐
相关产品推荐

