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

JavaScript:实现包含土耳其字符的字符串单词首字母大写(其余字母转为小写)

解决土耳其语Unicode字符的单词首字母大写问题

我懂你遇到的困扰——用常规正则处理土耳其语这类带特殊Unicode字符的字符串时,\b单词边界完全不靠谱,导致大写位置全错了。咱们来搞定这个问题:

问题根源

正则里的\b是基于ASCII规则的单词边界,它会把土耳其语的ş、ö、ı这类特殊字符当成「非单词字符」,所以会在错误的位置触发匹配,比如şöhret里h前面的位置被识别成单词边界,就出现了şöHret这种错误结果。

解决方案

改用Unicode属性类来匹配字母,同时避开\b的坑,结合土耳其语的本地化大小写转换:

const myStr = "şöhret için önce çalışmak/gerek";
const capitalizedStr = myStr.toLocaleLowerCase("tr-TR")
  .replace(/(^|[^\p{L}])\p{L}/gu, (match, leadingChar) => {
    // 保留开头的非字母字符,把单词首字母转成土耳其语大写
    return leadingChar + match.slice(-1).toLocaleUpperCase("tr-TR");
  });

console.log(capitalizedStr); // 输出: Şöhret İçin Önce Çalışmak/Gerek

代码详解

  1. toLocaleLowerCase("tr-TR"):先把整个字符串统一转成土耳其语标准的小写,确保像İ转成i、I转成ı这类符合土耳其语规则的转换。
  2. 正则/(^|[^\p{L}])\p{L}/gu:
    • ^匹配字符串开头,[^\p{L}]匹配任意非Unicode字母的字符(比如空格、斜杠)
    • \p{L}匹配任意语言的Unicode字母(完美覆盖土耳其语的特殊字符)
    • u标志开启Unicode模式,让正则支持\p{L}这类属性类
    • g标志全局匹配所有符合条件的位置
  3. 替换函数:
    • leadingChar是捕获到的开头字符(可能是字符串开头的空,也可能是空格、斜杠这类分隔符)
    • match.slice(-1)取到每个单词的第一个字母,用toLocaleUpperCase("tr-TR")转成土耳其语标准的大写(比如i转İ,ı转I,这是普通toUpperCase()做不到的)

这个方案不仅完美解决土耳其语的问题,还能适配其他带特殊Unicode字符的语言,只要替换对应的locale参数就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:27:41