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

JavaScript错字生成器:如何忽略首尾标点字符?

解决忽略首尾标点的单词内部打乱问题

你的代码目前能实现单词内部字母打乱但保留首尾字符,但无法区分首尾的标点和有效字母。要解决这个问题,我们需要先定位到单词中真正的有效首尾字母(跳过前后的标点),只打乱这两个字母之间的内容,同时保留前后的标点位置不变。

具体实现步骤

  • 定义需要忽略的标点集合,方便快速判断字符是否为标点
  • 遍历单词开头,找到第一个非标点字符的位置(startIndex)
  • 遍历单词结尾,找到最后一个非标点字符的位置(endIndex)
  • 如果单词全是标点,或者有效字母只有1个(startIndex >= endIndex),直接保留原单词
  • 仅打乱startIndex和endIndex之间的字符,首尾的标点和有效首尾字母保持不动

修改后的代码

// 定义需要忽略的标点集合
const punctuation = new Set(['.', '(', ')', ',', '!', '?', ';', ':']);

let scrambled = '';
for (var i = 0; i < words.length; i++) {
    var word = words[i];
    var letters = word.split("");
    let startIndex = 0;
    let endIndex = letters.length - 1;

    // 找到第一个非标点的索引
    while (startIndex < letters.length && punctuation.has(letters[startIndex])) {
        startIndex++;
    }
    // 找到最后一个非标点的索引
    while (endIndex >= 0 && punctuation.has(letters[endIndex])) {
        endIndex--;
    }

    // 如果没有有效字母,或者只有一个有效字母,直接保留原单词
    if (startIndex >= endIndex) {
        scrambled += word + " ";
        continue;
    }

    // 保存真正需要保留的首尾字母
    const firstLetter = letters[startIndex];
    const lastLetter = letters[endIndex];

    // 打乱中间的字符(startIndex+1 到 endIndex-1)
    for (var j = startIndex + 1; j < endIndex; j++) {
        var randomIndex = Math.floor(Math.random() * (endIndex - startIndex - 1)) + startIndex + 1;
        var temp = letters[randomIndex];
        letters[randomIndex] = letters[j];
        letters[j] = temp;
    }

    // 恢复首尾有效字母的位置
    letters[startIndex] = firstLetter;
    letters[endIndex] = lastLetter;

    scrambled += letters.join("") + " ";
}
document.body.innerText = scrambled;

代码说明

  1. 标点集合:用Set存储标点,判断字符是否为标点的效率更高
  2. 定位有效首尾:通过两个while循环跳过前后的标点,找到真正需要保留的首尾字母位置
  3. 边界判断:处理全标点、单字符单词的情况,避免无效打乱
  4. 精准打乱:只打乱有效首尾字母之间的部分,前后的标点完全不受影响,有效首尾字母也保持原位

内容的提问来源于stack exchange,提问作者Ryan Perez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:31:05