如何在JavaScript中保留指定子串列表并移除字符串其余字符?
解决JavaScript保留指定子串的问题
你的原代码逻辑存在致命问题:每次循环都会把当前字符串里除了当前子串包含的字符全部删除。比如第一次处理"The"后,字符串只剩"The";下一次处理"brown"时,"The"里的字符都不在"brown"中,直接被清空,最终自然没有内容留存。
下面给出两种可行的解决方案:
解法1:正则匹配所有目标子串后拼接
核心思路是把要保留的子串组合成正则表达式,一次性匹配原字符串中所有符合要求的子串,再将结果拼接起来。注意要转义子串中的正则特殊字符(比如.、*),避免匹配异常。
const listOfSubstrings = ["dog", "brown", "The", "jumps"]; const theString = "The quick brown fox jumps over the lazy dog"; // 转义正则特殊字符 const escapedSubstrings = listOfSubstrings.map(str => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')); // 构建匹配任意目标子串的全局正则 const matchRegex = new RegExp(`(${escapedSubstrings.join('|')})`, 'g'); // 匹配所有结果并拼接,无匹配时兜底空字符串 const result = (theString.match(matchRegex) || []).join(''); console.log(result); // 输出:Thebrownjumpsdog
解法2:遍历子串逐个提取累加
如果不想用复杂正则,也可以遍历每个目标子串,在原字符串中提取所有出现的该子串,逐步累加结果:
const listOfSubstrings = ["dog", "brown", "The", "jumps"]; const theString = "The quick brown fox jumps over the lazy dog"; let result = ''; for (const substr of listOfSubstrings) { // 转义特殊字符后匹配当前子串的所有实例 const matches = theString.match(new RegExp(substr.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g')); if (matches) { result += matches.join(''); } } console.log(result); // 输出:Thebrownjumpsdog
两种方法都能实现需求,第一种更简洁高效;如果原字符串中存在目标子串的重复实例,两种方法都会保留所有出现的内容。
内容的提问来源于stack exchange,提问作者Aku-Ville Lehtimäki
相关产品推荐
相关产品推荐

