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

如何正确转换双写拉丁字母 解决单字符优先匹配的转换错误

双写拉丁字母转换的修正方案

问题根因

原有实现采用逐单字符遍历匹配的逻辑,会优先触发长度为1的单字符转换规则,导致双写的长规则无法被匹配到,最终输出1a1a而非期望的2a。

解决方案

调整遍历逻辑,优先判断当前位置的双字符组合是否命中转换规则,命中则使用双字符转换规则并跳过下一个字符,未命中再 fallback 到单字符规则:

修正后的完整代码

JS 逻辑

var trans = {
  "a": "1a", 
  "aa": "2a",
  "e": "1e",
  "ee": "2e",
  "o": "1o",
  "oo": "2o",
}

function transliterate() {
  var latin = document.getElementById('latin').value;
  var result = '';
  var i = 0;
  while (i < latin.length) {
    // 优先匹配双字符规则
    if (i + 1 < latin.length && trans[latin[i] + latin[i+1]]) {
      result += trans[latin[i] + latin[i+1]];
      i += 2; // 跳过下一个已匹配的字符
    } else if (trans[latin[i]]) {
      // 匹配单字符规则
      result += trans[latin[i]];
      i += 1;
    } else {
      // 未命中规则的字符直接保留
      result += latin[i];
      i += 1;
    }
  }
  document.getElementById('result').innerHTML = result;
  return false;
}

document.getElementById('latin').addEventListener('keyup', transliterate);

HTML 结构

<input type="text" id="latin" />
<div id="result"></div>

效果验证

  • 输入aa → 输出2a
  • 输入aaooee → 输出2a2o2e
  • 输入aeo → 输出1a1e1o
  • 输入aab → 输出2ab

通用扩展方案

如果后续需要支持更长的多字符匹配规则(比如aaa→3a),可以提前计算转换规则中所有key的最大长度,每次遍历优先尝试匹配最长长度的子串,再逐步缩短长度尝试匹配,适配更多规则场景。

内容的提问来源于stack exchange,提问作者Leo Grace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:24:01