如何实现含重音字符文本按无重音查询分割并保留原格式?
问题根源
你的原有实现失败的核心原因是:正则直接匹配原文本的字面内容,归一化后的无重音pepe和原文本里带重音的pépé字面不相等,自然无法匹配成功。
解决思路
我们需要先对查询词做归一化(去重音、转小写)得到匹配基准,再遍历原文本逐段提取和查询词长度相同的子串,做同样的归一化处理后比对,匹配成功就取原文本的对应子串作为分割项,全程不会修改原文本字符,自然可以保留重音、大小写等原有格式。
修改后代码
const sanitizer = (text: string): string => { return text .normalize("NFD") .replace(/\p{Diacritic}/gu, "") .toLowerCase(); }; const splitter = (text: string, query: string): string[] => { const normalizedQuery = sanitizer(query); const queryLength = normalizedQuery.length; const result: string[] = []; let currentPos = 0; const textLength = text.length; while (currentPos <= textLength - queryLength) { // 提取当前位置和查询词等长的原文本子串 const matchCandidate = text.slice(currentPos, currentPos + queryLength); // 归一化后比对 if (sanitizer(matchCandidate) === normalizedQuery) { // 先加入匹配位置之前的文本 if (currentPos > 0) { result.push(text.slice(0, currentPos)); } // 加入匹配到的原文本子串(保留原有格式) result.push(matchCandidate); // 剩余文本继续处理 text = text.slice(currentPos + queryLength); currentPos = 0; continue; } currentPos++; } // 加入最后剩余的文本 if (text.length > 0) { result.push(text); } return result; };
效果验证
上述实现可以跑通你给出的所有测试用例,完全满足「重音不敏感匹配、分割结果保留原文本格式」的需求。
内容的提问来源于stack exchange,提问作者Adri HM
相关产品推荐
相关产品推荐

