You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现含重音字符文本按无重音查询分割并保留原格式?

问题根源

你的原有实现失败的核心原因是:正则直接匹配原文本的字面内容,归一化后的无重音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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 21:06:03