JavaScript实现带例外词规则的单词首字母大写功能
JavaScript 首字母大写(含指定例外词)实现方案
现存问题
原有实现存在3个核心缺陷,导致输出不符合预期:
- 正则通过
(?!^)跳过了字符串起始位置的匹配,无法保证句首单词首字母始终大写 - 仅处理了部分小写字母的大写转换,没有对单词除首字母外的字符做小写归一化
- 没有区分例外词的位置,非句首的大写例外词(比如示例里的
THE)不会被转成小写
原有错误实现代码:
function capitalizeFirst(str) { return str.replace(/(?!^)\b(?!(?:of|the)\b)([a-z])/g, m => m.toUpperCase()); } console.log(capitalizeFirst('the fox JUMP off of THE street'));
预期规则
- 例外词(如
of、the)仅在作为句首单词时首字母大写,其余位置统一全小写 - 所有单词除首字母外的剩余字符统一转为小写
- 非句首的非例外词首字母大写
- 示例输入
the fox JUMP off of THE street对应正确输出为The Fox Jump Off of the Street
正确实现代码
// 配置不需要大写的例外词,可按需扩展 const LOWERCASE_WORDS = new Set(['of', 'the']); function capitalizeFirst(str) { return str.replace(/\b([a-zA-Z]+)\b/g, (word, _, offset) => { const lowerWord = word.toLowerCase(); // 句首单词/非例外词需要首字母大写 if (offset === 0 || !LOWERCASE_WORDS.has(lowerWord)) { return lowerWord[0].toUpperCase() + lowerWord.slice(1); } // 非句首的例外词直接返回全小写 return lowerWord; }); } // 测试验证 console.log(capitalizeFirst('the fox JUMP off of THE street')); // 输出结果:The Fox Jump Off of the Street
实现逻辑说明
- 用正则
\b([a-zA-Z]+)\b匹配字符串中所有独立单词,回调中可拿到单词内容、单词在原字符串的起始偏移量offset - 每个单词先统一转成全小写,从根源解决原逻辑没有归一化字符大小写的问题
- 通过
offset === 0判断是否为句首单词,句首单词无论是否属于例外词,都执行首字母大写逻辑 - 非句首单词如果不在例外词集合中,执行首字母大写逻辑;如果属于例外词,直接返回全小写形式
- 用
Set存储例外词,查询时间复杂度为O(1),后续扩展例外词直接往集合中添加即可
内容的提问来源于stack exchange,提问作者Robert Smith
相关产品推荐
相关产品推荐

