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

如何使用JavaScript按特定规则修正单词开头的连续大写字母

问题描述

需求:实现一个名为autoCorrect的字符串转换函数,规则为当单词的第三个字母为小写时,将该单词的第二个大写字母转为小写。

  • 示例:"INput" → "Input"(前两个字母均大写,第三个小写,符合转换条件)
  • 例外:"INP"不修正(第三个字母是大写,不满足转换条件)
    注意:此需求并非将字符串转为首字母大写的标题格式,而是专门修正单词开头连续两个大写字母的场景。

以下是一个可行但不够优雅的实现代码,寻求优化建议:

String.prototype.isUpperCase = function() {
  return this.toString() === this.toUpperCase();
}

var str = "SOme Text THat NO YEs END";
var str2 = str[0] || '';

for (var i = 0; i < str.length; i++) {
  const next1 = str[i + 1] || '';
  const next2 = str[i + 2] || '';
  
  if (str[i].isUpperCase() && next1.isUpperCase() && !next2.isUpperCase()) {
    str2 += str[i+1].toLowerCase() || '';
  } else {
    str2 += str[i+1]  || '';
  }
}

console.log(str2);
优化方案

1. 避免全局原型污染,改用独立工具函数

原代码给String.prototype添加isUpperCase方法,容易在多人协作项目中引发命名冲突或意外覆盖。建议改用独立的判断函数,同时增加字母校验,避免对数字、符号等非字母字符误判:

const isUpperCase = (char) => char === char.toUpperCase() && /[A-Za-z]/.test(char);
const isLowerCase = (char) => char === char.toLowerCase() && /[A-Za-z]/.test(char);

2. 按单词拆分处理,逻辑更清晰

原代码逐字符遍历整个字符串,未区分单词边界,容易在空格衔接处出现错误。拆分单词后逐个处理,逻辑更直观,也能避免跨单词的误判:

function autoCorrect(str) {
  const isUpperCase = (char) => char === char.toUpperCase() && /[A-Za-z]/.test(char);
  const isLowerCase = (char) => char === char.toLowerCase() && /[A-Za-z]/.test(char);
  
  return str.split(' ').map(word => {
    // 单词长度不足3,直接返回原单词
    if (word.length < 3) return word;
    // 检查前两个大写、第三个小写的条件
    if (isUpperCase(word[0]) && isUpperCase(word[1]) && isLowerCase(word[2])) {
      return word[0] + word[1].toLowerCase() + word.slice(2);
    }
    return word;
  }).join(' ');
}

// 测试示例
console.log(autoCorrect("SOme Text THat NO YEs END")); // 输出:Some Text That NO YEs END

3. 正则表达式实现,代码更简洁高效

如果熟悉正则语法,用正则替换可以大幅简化代码,同时保证逻辑准确:

function autoCorrect(str) {
  // \b 匹配单词边界,确保只处理单词开头的连续大写
  // 捕获组分别匹配第一个大写、第二个大写、第三个小写字母
  return str.replace(/\b([A-Z])([A-Z])([a-z])/g, (match, first, second, third) => {
    return first + second.toLowerCase() + third;
  });
}

// 测试示例
console.log(autoCorrect("SOme Text THat NO YEs END")); // 输出:Some Text That NO YEs END

4. 原代码的逻辑漏洞修复

原代码在遍历过程中会重复处理字符(比如i=0时处理i+1,i=1时再次处理该位置),且未考虑单词边界,可能导致空格后的字符被错误判断。拆分单词或使用正则的方式从根源上避免了这类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:15:33