5234

如果字符串的第一个字符是一个字母,如何使其大写,但不改变其他任何字母的大小写?

例如:

  • “这是一个测试”“这是一个测试”
  • “艾菲尔铁塔”“埃菲尔铁塔”
  • “/index.html”“/index.html”
  • 21
    强调有一个名为下芯管柱这包括这个和其他一些很棒的工具。
    – 亚伦
    2013年4月15日19:16
  • 4
    对于使用角形的管道,有一个标题框管道:angular.io/api/common/TitleCase管道 2021年1月27日20:54
  • 对于那些不知道Stack Overflow是如何设计的人:解决建议会作为“答案”发布到页面上。任何未解决的建议、澄清请求和单独/相关超链接都可以作为问题下的评论发布。 2021年6月16日23:17

106答案106

重置为默认值
7944
+50
函数大写FirstLetter(字符串){return string.charAt(0).toUpperCase()+string.slice(1);}

其他一些答案修改字符串.原型(这个答案过去也是这样),但我建议现在不要这样做,因为它具有可维护性(很难找到函数被添加到原型并且如果其他代码使用相同的名称/浏览器将来添加具有相同名称的本机函数,则可能导致冲突)。

5
  • 4
    下面是TypeScript中的解决方案,其中返回的类型是大写的单词,而不是一串:常量大写=<T extends string>(s:T)=>(s[0].toUpperCase()+s.slice(1))作为大写<typeof s>; 2023年3月27日17:56
  • 1
    下面的答案中提到了这一点,但值得在这里指出:这个答案并不适用于所有Unicode文本。超车”𐐨𐑍𐑏“到此函数返回相同的字符串,但它应该返回”𐐀𐑍𐑏“。那是因为字符位于以UTF16代码单位拆分。SMP中有一些带有case-folding定义的字符,它们使用两个UTF16代码单元进行编码。虽然很简单,但不应该使用。 2023年9月28日7:34
  • 4
    你甚至不需要使用罕见的语言来打破这种局面。Unicode连字字符也打破了这一点:“flat”(飞行)返回为“FLat”(FLat). 2023年9月28日7:42
  • 哇,我不知道大写<T>TS中的实用程序。太棒了!
    – 无序
    3月19日11:39
  • @无序——这不是一个洗钱特征。Dan只是将该函数定义为一个类型安全的单行程序。。。不是很有用吗? 5月3日8:58
1631

编辑以添加此免责声明:请阅读注释以了解编辑JS基本类型的风险。


下面是一种更面向对象的方法:

Object.defineProperty(String.prototype,'capitalize'{value:函数(){返回this.charAt(0).toUpperCase()+this.slice(1);},可枚举:false});

您可以这样调用该函数:

“你好,世界!”.capitalie();

预期输出为:

“你好,世界!”
11
  • 77
    @尼尔斯卢卡斯很公平。它有可能打破JS未来的新增功能。如果是只有你才会使用的代码,那也没那么糟糕——你只需更新代码并继续。这里真正的问题是,当你开始用这样的代码发布库时:你的代码会修改使用你的代码的每个库的内置行为。结果是,如果您和另一个库作者都用自己的实现重写了相同的内置程序,那么您会在另一个库里的代码中(或最后加载的代码)创建bug,让用户调试大量不可修复的bug报告。 2021年7月1日3:52
  • 6
    @aggregate1166877谢谢您的解释。我完全同意你的观点,这种方法不是创建库的好方法,我也同意这种方法对项目来说很好。希望人们会读到这篇文章,因为我认为这是一个很好的原创答案。 2021年7月1日13:59
  • 对不起,但没有,只是不要向基本类型添加任何函数。扩展它们?constExtendedString=class extendsString{capitalie(){return this[0].toUpperCase()+this.slice(1)}}const s=new Extended字符串('hello')console.log(s.capitalite()) 2021年10月26日14:01
  • 如果我添加过这样的自定义函数,我的方法是为这些方法的名称添加唯一范围。例如,如果您的项目名称是MyProject,那么它将是“hello world”.myProjectCapitalis()或其他类似的名称。因此,如果外部发生变化,它不会与该名称冲突。只需要确保范围在您的上下文中足够独特。
    – 维鲁斯
    2023年11月7日12:48
  • @病毒要么使用符号,要么不更改内置类型。没有理由跳过铁环。 2023年11月7日12:57
1089

仅使用CSS及其文本转换属性:

p: :第一个字母{文本转换:大写;}
4
  • 175
    $('#mystring_id').text(string).css('text-transform','capitalize');
    – 唐姆布
    2015年9月24日17:34
  • 55
    此外,这只影响字符串的显示,而不影响实际值。例如,如果它是在表单中,那么该值仍将作为-is提交。 2016年6月7日13:26
  • 13
    阿尔索::第一个字母仅适用于具有显示的值,内联块,表格单元格,列表-项目表格标题在所有其他情况下,::第一个字母没有效果。 2021年12月8日13:11
  • 5
    ^我非常好奇为什么这对弯曲网格....
    – 利兰
    2023年5月19日13:01
495

下面是流行答案的缩写,它通过将字符串视为数组来获得第一个字母:

函数大写{return s[0].toUpperCase()+s.slice(1);}

更新

根据下面的评论,这在IE7或更低版本中不起作用。

更新2:

为了避免未定义对于空字符串(请参见@njzk2的评论如下),您可以检查空字符串:

函数大写{返回s&&s[0].toUpperCase()+s.slice(1);}

ES6版本

常量大写=s=>s&&s[0].toUpperCase()+s.slice(1)//当s可能为falsy而非empty-string时,始终返回类型string事件常量大写=s=>(s&&s[0].toUpperCase()+s.slice(1))||“”
  • 4
    要始终返回字符串,我发现是吗?s[0].toUpperCase()+s.slice(1):“”可读性更强 2023年1月19日11:43
  • 如果您有来自对象的字符串,请使用例如。elem.name[0].toUpperCase()+elem.name.slice(1)
    – 蒂莫
    2月7日9:46
  • 可能与您的答案无关,但为什么要为短代码提供一个单行函数?记住字符串操作是我们应该训练的,以使大脑保持忙碌。
    – 蒂莫
    2月27日17:57
297

如果您对发布的几个不同方法的性能感兴趣:

以下是基于这个jsperf测试(从最快到最慢排序)。

如您所见,前两种方法在性能方面基本上是可比较的,而改变字符串.原型就性能而言,这是迄今为止最慢的。

//10889187次操作/秒函数大写FirstLetter(字符串){返回字符串[0].toUpperCase()+string.slice(1);}//10875535次操作/秒函数大写FirstLetter(字符串){return string.charAt(0).toUpperCase()+string.slice(1);}//4632536次操作/秒函数大写FirstLetter(字符串){return string.replace(/^./,string[0].toUpperCase());}//1977828次操作/秒String.prototype.capitalizeFirstLetter=函数(){return this.charAt(0).toUpperCase()+this.slice(1);}

在此处输入图像描述

1
  • 6
    我想知道为什么最后一个方法如此缓慢,你是否每次迭代都将函数附加到原型上?那是不公平的 2021年10月26日14:06
279

我在现有的有关以下问题的答案中没有看到任何提及星体平面代码点或国际化。“大写字母”在使用给定脚本的每种语言中的含义并不相同。

起初,我没有看到任何解决星体层代码点相关问题的答案。那里是一个,但它有点埋了(我想这一个会是这样的!)

隐藏问题及其各种解决方法概述

大多数建议的功能如下所示:

函数大写首字母(str){return str[0].toUpperCase()+str.slice(1);}

然而,一些大小写字符不在BMP(基本多语言平面,代码点U+0到U+FFFF)范围内。以Deseret文本为例:

大写首字母(“𐐶𐐲𐑌𐐼𐐲𐑉"); // "𐐶𐐲𐑌𐐼𐐲𐑉"

这里的第一个字符无法大写,因为字符串的数组索引属性不访问“字符”或代码点*。他们访问UTF-16代码单元。切片时也是如此,索引值指向代码单元。

UTF-16代码单元正好是1:1,USV代码点在两个范围内,即U+0到U+D7FF和U+E000到U+FFFF。大多数大小写字符都属于这两个范围,但不是全部。

从ES2015开始,处理这个问题变得更容易了。String.prototype[@@iterator]生成与代码点**对应的字符串。例如,我们可以这样做:

函数大写FirstLetter([first='',…rest]){return[first.toUpperCase(),…rest].join('');}大写首字母(“𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"

对于较长的字符串,这可能不是非常有效的***-我们实际上不需要迭代余数。我们可以用字符串.原型.代码指向为了得到第一个(可能的)字母,但我们仍然需要确定切片应该从哪里开始。避免迭代余数的一种方法是测试第一个码点是否在BMP之外;如果不是,切片从1开始,如果是,切片从2开始。

函数大写首字母(str){if(!str)返回“”;const firstCP=str.codePointAt(0);常量索引=第一个CP>0xFFFF?2 : 1;return String.fromCodePoint(firstCP).toUpperCase()+str.slice(index);}大写首字母(“𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"

你可以用位数学代替>0xFFFF(0xFF关闭)在那里,但是用这种方式可能更容易理解,而且两者都会达到同样的目的。

如果必要的话,我们也可以在ES5及以下版本中进一步完善这个逻辑。ES5中没有用于处理代码点的内部方法,因此我们必须手动测试第一个代码单元是否是代理****:

函数大写FirstLetter(str){if(!str)返回“”;var firstCodeUnit=字符串[0];if(firstCodeUnit<'\uD800'||firstCode Unit>'\uDFFF'){return str[0].toUpperCase()+str.slice(1);}return str.slice(0,2).toUpperCase()+str.slices(2);}大写首字母(“𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"

深入国际化(谁的资本化?)

一开始我还提到了国际化的考虑。其中一些很难解释,因为它们不仅需要以下方面的知识什么语言正在被使用,但也可能需要对语言中的单词有特定的知识。例如,爱尔兰有向图“mb”在单词开头大写为“mb”。另一个例子,德语eszett,从不以单词(afaik)开头,但仍然有助于说明这个问题。小写的eszett(“ß”)大写为“SS”,但“SS”可以小写为“ࢹ”或“SS”-您需要具备德语的课外知识才能知道哪一个是正确的!

这类问题中最著名的例子可能是土耳其语。在土耳其语拉丁语中,i的大写形式是is,而i的小写形式是In——它们是两个不同的字母。幸运的是,我们确实有办法解释这一点:

函数大写FirstLetter([first='',…rest],语言环境){return[first.toLocaleUpperCase(locale),…rest].join('');}大写首字母(“意大利”,“en”)//“意大利”大写首字母(“italya”,“tr”)//“伊塔利亚”

在浏览器中,用户最喜欢的语言标签由导航器.语言,可以在中找到按优先顺序排列的列表导航器.语言,可以(通常)使用对象(element.least('[lang]')).lang||YOUR_DEFAULT_HERE在多语言文档中。

在ES2018中引入的支持RegExp中Unicode属性字符类的代理中,我们可以通过直接表示我们感兴趣的字符来进一步清理内容:

函数capitalieFirstLetter(str,locale=navigator.language){return str.replace(/^\p{CWU}/u,char=>char.toLocaleUpperCase(locale));}

这可以稍作调整,以处理字符串中多个单词的大写,至少在某些语言中具有相当好的准确性,但如果这样做,无论主要语言是什么,都很难完全避免出现离群情况。

这个CWU公司更改_When_Uppercasedcharacter属性匹配在缺少特定区域设置数据的通用情况下大写时更改的所有代码点。您可能希望使用其他与案例相关的Unicode字符属性。这是一个很酷的探索区域,但如果我们在这里一一列举,我们会继续一整天。不过,如果你不熟悉,以下内容可以激发你的好奇心:\p{下}是一个比\p{小写字母}(又名\p{Ll})-方便图示由Unicode提供的此工具中的默认字符集比较.(注意:并非所有可以引用的内容都可以在ES正则表达式中使用,但您可能需要的大多数内容都是)。

JS中case-mapping的替代方案(Firefox和CSS喜欢荷兰!)

如果具有唯一区域设置/语言/正字法大写规则的有向图恰好在Unicode中有一个代码点“组合”表示,那么即使在没有区域设置数据的情况下,这些规则也可能被用来明确人们的大写期望。例如,我们可以选择组合的i-j有向图,ij/U+133与Dutch关联,以确保大小写映射到大写字母IJ/U+132:

大写首字母(“ijsselmeer”);//“IJsselmeer”

另一方面,预合成的有向图和类似的图有时会被弃用(就像那样,看起来!),并且在互换文本中可能是不受欢迎的,因为如果人们在实践中不按常规方式键入序列,那么可能会产生复制糊麻烦。不幸的是,在缺少预组合“提示”的情况下,显式语言环境在这里没有帮助(至少据我所知)。如果我们拼写艾塞尔米尔和一个普通人+j,大写首字母即使我们明确指出,也会产生错误的结果荷兰作为区域设置:

大写第一个字母('jsselmeer','nl');//“Ijsselmeer”:(

(我不完全确定是否有某些情况下行为与ICU数据可用性有关——也许其他人可以这么说。)

如果转换的目的是在web浏览器中显示文本内容,那么您有一个完全不同的选择,这可能是您的最佳选择:利用web平台的其他核心语言HTML和CSS的功能。使用HTMLlang=。。。和CSS文本转换:。。。,您得到了一个(伪)声明性解决方案,为用户代理留出了额外的空间“聪明。”JS API需要在所有浏览器(通常)中都具有可预测的结果,并且不能随意尝试启发式。然而,用户代理本身只对其用户负有义务,当输出针对人类时,启发式解决方案是公平的。如果我们告诉它“此文本是荷兰语,但请以大写形式显示”,现在不同浏览器的特定结果可能会有所不同,但这可能是每个浏览器所能做到的最好的结果。让我们看看:

<!文档类型html><dl><dt>未转换伊斯塞尔梅尔<dt>以CSS和<code>lang=en大写ijsselmeer公司<dt>以CSS和<code>lang=nl大写ijsselmeer公司

在写作时,Chromium中的英语和荷兰语行都是伊塞尔梅尔-所以它并不比JS好。但在当前的Firefox中试试吧!我们告诉浏览器包含荷兰语的元素将正确呈现为伊杰塞尔梅尔那里。

这个解决方案是针对特定目的的(无论如何,它在Node中都不会对你有所帮助),但我之前没有引起人们的注意是愚蠢的,因为有些人可能没有意识到他们在谷歌上搜索到了错误的问题。感谢@paul23在实践中进一步澄清IJ有向图的性质并促使进一步调查!


截至2021年1月,所有主要引擎都实现了Unicode属性字符类功能,但根据您的目标支持范围,您可能还无法安全使用它。最后一个引入支持的浏览器是Firefox(78;2020年6月30日)。您可以使用Kangax兼容表.Babel可用于编译RegExp文本,其中包含对等效模式的属性引用,但要注意,生成的代码有时可能非常庞大。除非您确定这种权衡对于您的用例来说是合理的,否则您可能不想这样做。


问这个问题的人很可能与Deseret资本化或国际化无关。但是,意识到这些问题是件好事,因为即使这些问题目前并不令人担忧,最终你也很有可能会遇到它们。它们不是“边缘”案例,或者更确切地说,它们不是按定义边缘案例——无论如何,在整个国家,大多数人都说土耳其语,将代码单元与代码点混为一谈是一个相当常见的错误来源(尤其是在表情符号方面)。字符串和语言都很复杂!


*UTF-16/UCS2的代码单元在某种意义上也是Unicode代码点,例如U+D800在技术上是一个代码点,但这不是它在这里的“意思”。。。某种程度上。。。尽管它变得相当模糊。但是,代理项肯定不是USV(Unicode标量值)。

**尽管如果代理代码单元是“孤立的”,即不是逻辑对的一部分,您仍然可以在这里获得代理。

***也许吧。我还没有测试过它。除非你确定资本化是一个有意义的瓶颈,否则我可能不会费劲——选择你认为最清晰易读的内容。

****这样的函数可能希望测试第一个和第二个代码单元,而不仅仅是第一个,因为第一个单元可能是孤立的代理。例如,输入“\uD800x”将X as-is大写,这可能是预期的,也可能不是预期的。

8
  • 我一直在想为什么将字符串转换成大写对某些语言没有太大帮助。。。但是没有足够的关心去发现。很高兴我终于做到了,这是一本非常有趣的书! 2021年7月19日22:09
  • 这似乎不适用于荷兰语中的“IJ”等双连字符。使用最新版本时,此处的示例错误地大写为“Ijsselmeer”(正则表达式版本)。我使用的代码是:大写首字母('ijssel','nl-nl')-这是一个正确的本地化字符串,对吗?
    – 保罗23
    2021年8月24日11:38
  • “ij”作为U+69,U+6A将大写为“ij”,是的,“ij”(U+133,单个代码点)是大写为“IJ”的(U+132)。这里的本地化意识只扩展到Unicode定义的案例映射规则,有时每个语言都不同,如土耳其语;知道“ij”(U+69,U+6A)应解释为ij(U+133)超出了其范围,至少需要该语言的字典。
    – 分号
    2021年8月25日12:09
  • 在荷兰,荷兰语IJ被视为两个字母,只是同时大写(与比利时版本相反)。
    – 保罗23
    2022年6月23日16:52
  • 1
    回答得很好!这里有这么多破解的答案,真让人尴尬。我建议在顶部添加一个小的“tl;dr”部分。 2023年9月28日7:55
169

对于另一种情况,我需要它将第一个字母大写,其余字母小写。以下情况使我更改了此函数:

//电子系统5函数大写(字符串){return string.charAt(0).toUpperCase()+string.slice(1).toLowerCase(;}大写(“alfredo”)//=>“alfredo“大写(“Alejandro”)//=>“Alejandero大写(“ALBERTO”)//=>“ALBERTO”大写(“ArMaNdO”)//=>“ArMaNdO”//es6使用破坏const capitalie=([first,…rest])=>first.toUpperCase()+rest.join(“”).toLowerBase();
0
101

如果您已经(或考虑)使用洛达什,解决方案很简单:

_.upperFirst(“红色”);//=>“弗雷德”_.upperFirst(“FRED”);//=>“FRED”_.大写('fred')//=>'fred'

请参阅他们的文档:https://lodash.com/docs#大写

_.ceamCase(“Foo Bar”);//=>“fooBar'

https://lodash.com/docs/4.15.0#camelCase

_.lowerFirst(“弗雷德”);//=>“弗雷德”_.lowerFirst(“FRED”);//=>“fRED”_.snakeCase(“Foo Bar”);//=>“foo_bar”

第一个大写的Vanilla JavaScript:

函数upperCaseFirst(str){return str.charAt(0).toUpperCase()+str.substring(1);}
97

这是2018 ECMAScript 6+解决方案:

const str=“埃菲尔铁塔”;const newStr=`${str[0].toUpperCase()}${str.slice(1)}`;console.log('原始字符串:',str);//埃菲尔铁塔console.log('新字符串:',newStr);//埃菲尔铁塔

0
87

有一种非常简单的方法来实现它代替。对于ECMAScript 6:

“foo”.replace(/^./,str=>str.toUpperCase())

结果:

“Foo”
2
  • 使用/^[a-z]/i将比使用更好.因为前面的一个不会试图替换字母以外的任何字符 2019年7月6日5:56
  • 8
    @CodeManiac除了[a-z]之外,还有很多语言和字母 2021年9月11日23:20
70

仅CSS

如果只需要在网页上显示转换:

p: :第一个字母{文本转换:大写;}
  • 尽管被称为“::第一个字母“,它适用于第一个性格,即字符串情况%一个,此选择器将应用于%因此不会被资本化。
  • 在IE9+或IE5.5+中,只支持使用一个冒号的传统表示法(:第一个字母).

ES2015单线

常量大写FirstChar=str=>str.charAt(0).toUpperCase()+str.substring(1);

评论

  • 在我执行的基准测试中string.charAt(0)字符串[0]然而,请注意字符串[0]将是未定义对于空字符串,因此必须重写函数才能使用“string&&string[0]“,与替代方案相比,这太冗长了。
  • string.substring(1)比…快string.slice(1).

基准介于子字符串()切片()

现在差别很小(自己进行测试):

  • 21580613.15操作/秒±1.6%子字符串(),
  • 21096394.34操作/秒±1.8%(慢2.24%)的切片().

解决方案比较

2
66

将字符串中所有单词的第一个字母大写:

函数ucFirstAllWords(str){var pieces=str.split(“”);for(var i=0;i<计件长度;i++){var j=件[i].charAt(0).toUpperCase();件[i]=j+件[i]。子(1);}返回件。连接(“”);}
5
  • 16
    重读问题:我想大写字符串的第一个字符,但不要改变其他字母的大小写。 2011年11月30日19:13
  • 2
    我知道我做了。如果整个字符串开始大写,我会添加一件事:片段[I]=j+片段[I].substr(1).toLowerCase(); 2012年12月20日21:16
  • 5
    这种情况的另一个解决方案是:函数capitalieFirstLetters(s){return s.split(“”).map(function(w){retturn w.charAt(0).toUpperCase()+w.subtr(1)}).jin(“”。 2013年3月10日21:36
  • 最好先将整个字符串小写 2016年7月6日10:36
  • 1
    除了这个函数没有回答问题之外,它实际上也过于复杂。s=>s.split('').map(x=>x[0].toUpperCase()+x.slice(1)).join('') 2017年7月28日18:10
63

使用以下方法处理这些东西总是更好CSS优先一般来说,如果您可以使用CSS解决问题,请首先使用CSS,然后尝试使用JavaScript解决问题,因此在本例中,请尝试使用:第一个字母在CSS中并应用文本转换:大写;

因此,请尝试为此创建一个类,以便可以全局使用它,例如:.第一个字母大写并在CSS中添加如下内容:

.第一个字母大写:第一个字母{文本转换:大写;}

另外,另一种选择是JavaScript,因此最好是这样:

函数大写文本(txt){return txt.charAt(0).toUpperCase()+txt.slice(1)//或者,如果您想要小写rest txt.slice(1).toLowerCase();}

并将其称为:

capitaleText('这是一个测试');//return“这是一个测试”capitaleText(“埃菲尔铁塔”);//return“埃菲尔铁塔”大写文本('/index.html');//返回'/index.html'大写文本('alireza');//return“Alireza”大写文本('dezfulian');//return'Dezfoulian'

如果您想反复使用它,最好将其附加到javascript本机String,如下所示:

String.prototype.capitalizeText=String.propotype.capitalizeTxt||function(){返回this.charAt(0).toUpperCase()+this.slice(1);}

并按如下方式命名:

'这是一个测试'.capitalieTxt();//return“这是一个测试”“埃菲尔铁塔”.capitaleTxt();//return“埃菲尔铁塔”'/index.html'.capitalieTxt();//返回'/index.html'“alireza”.capitalieTxt();//return“Alireza”
56
String.prototype.capitalize=函数(allWords){return(allWords)?//如果所有单词this.split(“”).map(word=>word.capitalie()).join(“””)://将短语分解为单词,然后递归//调用直到所有单词大写this.charAt(0).toUpperCase()+this.slice(1);//如果所有单词未定义,则只将第一个单词大写,//表示整个字符串的第一个字符}

然后:

“只大写第一个单词”.capitalie();==>“仅将第一个单词大写”“大写所有单词”。大写(true);==>“所有单词大写”

2016年11月更新(ES6),仅用于乐趣:

const capitalie=(string='')=>[…string].map(//转换为包含每个项的数组是//字符串,使用扩展运算符(…)(字符,索引)=>索引?char:char.toUpperCase()//Index true表示不等于0,因此(!Index)为//大写的第一个字符//“toUpperCase()”方法).join(“”)//返回字符串

然后大写(“hello”)//你好

  • 6
    我认为这是一个糟糕的解决方案,原因有二:修改原语的原型是一个坏主意。如果规范发生变化,他们决定选择“大写”作为新的原型属性名称,那么您就破坏了核心语言功能。此外,选择的方法名称也很差。乍一看,我认为这将大写整个字符串。使用更具描述性的名称,如PHP的ucFirst或类似名称可能是一个更好的主意。 2017年2月22日1:08
  • 另一个ES6答案更简单:const capitalie=([first,…rest])=>first.toUpperCase()+rest.join(“”).toLowerBase();. 2019年6月22日5:50
  • 1
    @dudewad在css中,单词第一个字母的大写称为“大写”,如果你想将所有字符都大写,你可以使用“大写”。 2021年1月25日10:56
53

最短3个解决方案,1个和2个处理案例字符串为“”,无效的未定义:

s&&s[0].toUpperCase()+s.slice(1)//32字符s&&s.replace(/./,s[0].toUpperCase())//36字符-使用regexp'foo'.replace(/./,x=>x.toUpperCase())//31 char-字符串上的直接字符,ES6

让s=“oo bar”;控制台.log(s&&s[0].toUpperCase()+s.slice(1));console.log(s&&s.replace(/./,s[0].toUpperCase()));console.log(“foo bar”.replace(/./,x=>x.toUpperCase()));

0
51

我们可以用我最喜欢的一个角色扮演第一个角色注册Exp,看起来像个可爱的笑脸:/^/

String.prototype.capitalize=函数(){return this.replace(/^./,函数(match){return match.toUpperCase();});};

对于所有咖啡迷来说:

字符串::大写=->@替换/^./,(匹配)->与UpperCase()匹配

……对于所有认为有更好的方法可以做到这一点的人来说,不需要扩展本机原型:

var大写=函数(输入){返回input.replace(/^./,函数(match){return match.toUpperCase();});};
2
  • 亲爱的老爷,这个问题有一百万个答案!您的解决方案在es6中看起来更好。“回答”。替换(/^./,v=>v.toLowerCase()) 2019年7月29日0:40
  • 你说的“咖啡”是什么意思?"咖啡脚本"? 2021年1月6日23:38
51

这是一个名为ucfirst()(大写首字母的缩写):

函数ucfirst(str){var firstLetter=str.substr(0,1);return firstLetter.toUpperCase()+str.substr(1);}

您可以通过调用ucfirst(“一些字符串”)--例如,

ucfirst(“这是一个测试”)-->“这是测试”

它的工作原理是把绳子分成两段。在第一条线上,它拔出第一封信然后在第二行资本化第一封信通过呼叫第一封信发给UpperCase()并将其与字符串的其余部分连接起来,该字符串通过调用str.substr(1).

您可能会认为,对于空字符串,这将失败,实际上,在C语言中,您必须满足这一点。然而,在JavaScript中,当您获取空字符串的子字符串时,只会得到一个空字符串。

  • 9
    @999:它在哪里说的substr()已弃用?不是这样的即使是现在,三年后,更不用说回到2009年你发表此评论的时候了。 2012年11月7日6:12
  • substr()可能不会被任何流行的ECMAScript实现标记为已弃用(我怀疑它不会很快消失),但它不是ECMAScript规范的一部分。规范的第三版在非规范性附录中提到了这一点,以便“在不使属性或其语义成为本标准一部分的情况下,为此类属性建议统一的语义”。 2012年11月21日22:05
  • 有三种方法做同样的事情(子串,子(substr))太多了,我总是用因为它支持负索引,所以它没有令人困惑的参数切换行为,其API类似于其他语言。 2012年11月21日22:12
50

如果您可以将每个单词的第一个字母大写,并且您的用例是HTML格式的,那么您可以使用以下CSS:

<style type=“text/css”>p.大写{text-transform:大写;}</style>这是一些文本</p>(第页)

这是来自CSS文本转换属性(于W3学校).

15
  • 30
    @Simon并没有说明字符串必须作为HTML文档的一部分输出,CSS只有在这样的情况下才有用。 2012年1月18日9:32
  • 10
    Adam说的没错,但我想95%以上的Javascript都是与HTML和CSS一起使用的。不幸的是,“大写”语句实际上是大写的每个字,所以您仍然需要JS来仅大写字符串的第一个字母。 2012年1月21日4:24
  • 19
    不正确,迪内什。他说字符串的第一个字符. 2012年6月26日0:02
  • 86
    这个答案,尽管获得了荒谬的赞成票,但却是错误的,因为它将大写每一个单词@Ryan,你将获得纪律徽章如果你删除它。请这样做。 2012年11月7日6:06
  • 6
    现在是javascript:$('.capitalize').css('text-transform','capitalize]) 2013年4月13日8:58
49

使用:

var str=“ruby java”;console.log(str.charAt(0).toUpperCase()+str.substring(1));

它将输出“Ruby java”到控制台。

0
48

如果您使用下划线.js洛达什,的下芯管柱库提供字符串扩展,包括大写:

_.capitalie(string)将字符串的第一个字母转换为大写。

例子:

_大写(“foo bar”)==“foo bar”
  • 自,版本3.0.0,默认情况下,Lo-Dash具有此字符串方法。就像这个答案中描述的那样:_大写(“foo”)===“foo”. 2015年4月9日19:09
  • 还有一个有用的underscore.js函数使人性化它将带下划线、驼色或破折号的字符串转换为人性化字符串。还删除了开始和结束空格,并删除了后缀“_id”。 2015年5月7日14:11
  • 2
    从版本4*开始,Lodash也每隔一个字母小写(),小心! 2016年2月13日8:33
39

如果要重新格式化全大写文本,则可能需要修改其他示例:

函数大写(文本){return text.charAt(0).toUpperCase()+text.slice(1).toLowerCase(;}

这将确保更改以下文本:

测试=>测试这是测试=>这是测试
2
  • 可能值得注意的是,这也会将首字母缩写转换为小写,所以在大多数情况下可能不是最佳主意
    – 单克朗
    2016年4月25日5:08
  • 顺便说一句,这将打破大写首字母缩写词,所以你们要小心 2019年3月15日21:53
38
var capitalized=yourstring[0].toUpperCase()+yourstring.substr(1);
0
34
函数大写{//返回首字母大写+来自索引1和out aka的字符串。绳子的其余部分return s[0].toUpperCase()+s.substr(1);}//示例大写(“这是一个测试”);=>“这是一个测试”大写(“艾菲尔铁塔”);=>“埃菲尔铁塔”大写('/index.html');=>“/index.html”
2
  • 1
    这怎么比2009年的答案?. 2019年1月27日22:13
  • 1
    它不是@DanDascalescu。我想你可以这么说子(substr)/子串与之相反,它的语义更丰富,但这只是一个偏好问题。然而,我确实包含了问题中提供的字符串示例,这是09年示例中没有的一个好方法。我真的认为这归结为15岁的我想要StackOverflow上的业力;) 2019年6月20日11:50
34
yourString.replace(/\w/,c=>c.toUpperCase())

我发现这个箭头功能最简单。更换匹配第一个字母字符(\w个)并将其转换为大写。不需要任何幻想。

  • 5
    这应该是公认的答案,而这几乎是自SO不断奖励过时问题以来的最后一次。顺便说一句,最好用/./有两个原因:/\w个/将跳过前面所有的非字母字符(因此@@abc将变为@@abc),然后它不适用于非拉丁字符 2019年4月29日18:01
  • 这是一个好答案!有一个小小的警告:\w匹配基本拉丁字母中的任何字母数字字符,包括下划线。所以替换一个单词,比如_老板将屈服_老板(来自developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…) 2022年5月5日17:25
  • @“erbanGhi”同样适用于1亏损。如果匹配下划线不是所需的行为,请使用[A-Za-z-0-9][^\W_]. 2023年5月19日22:35
34
String.prototype.capitalize=函数(){return this.replace(/(^|\s)([a-z])/g,函数(m,p1,p2){将p1+p2.返回到UpperCase();});};

用法:

capitalizedString=someString.capitalize();

这是一个文本字符串=>这是文本字符串

5
  • +1,这是我真正想要的。不过有一个小错误,应该是return.this.toLocaleLowerCase().replace(... 2013年1月14日21:55
  • +1,我发现这个页面在寻找phpsucfirst的javascript版本,我怀疑大多数人都是这样找到的。 2013年4月9日13:58
  • @DanDascalescu我发现这很有用,所以+1功利主义和-1抗过敏性。他包括了一个例子,所以它的功能很清楚。 2013年8月2日10:24
  • 1
    String.prototype.capitalize=函数(){return this.replace(/(^|\s)[a-z]/g,函数(m){retain m.toUpperCase();});我稍微重构了一下您的代码,您只需要第一个匹配项。
    – 迁移
    2014年4月28日16:29
  • 首先,它做了OP要求的以外的事情,其次,在这种情况下regex是一种低效的过度使用,最后,不要修改你不拥有的东西的原型 2017年9月23日19:32
34

适用于所有Unicode字符的解决方案

57这个问题有81个不同的答案,有些是离题的,但没有人其中提出了一个重要问题,即列出的解决方案都不能在许多浏览器中使用亚洲字符、表情符号和其他高Unicode点值字符。以下是一个解决方案:

const consistantCapitalizeFirstLetter=“\uD852\uDF62”.length===1?功能(S){“use-strict”;//万岁!浏览器使用UTF-32!返回S.charAt(0).toUpperCase()+S.substring(1);}:函数(S){“使用-价格”;//浏览器正在使用UCS16存储UTF-16var代码=S.charCodeAt(0)|0;返回(代码>=0xD800&代码<=0xDBFF?//检测代理项对S.slice(0,2).to UpperCase()+S.substring(2):S.charAt(0).toUpperCase()+S.substring(1));};constprettyCapitalizeFirstLetter=“\uD852\uDF62”.length===1?功能(S){“use-strict”;//万岁!浏览器使用UTF-32!return S.charAt(0).toLocaleUpperCase()+S.substring(1);}:函数(S){“使用-价格”;//浏览器正在使用UCS16存储UTF-16var代码=S.charCodeAt(0)|0;返回(代码>=0xD800&代码<=0xDBFF?//检测代理项对S.slice(0,2).toLocaleUpperCase()+S.substring(2):S.charAt(0).toLocaleUpperCase()+S.substring(1));};

请注意,上述解决方案试图解释UTF-32。然而,该规范正式声明,浏览器需要使用映射到UCS2的UTF-16完成所有操作。然而,如果我们齐心协力,尽自己的一份力量,开始为UTF32做准备,那么TC39可能会允许浏览器开始使用UTF-32(就像Python如何为字符串的每个字符使用24位)。对于一个说英语的人来说,这一定很傻:没有一个只使用拉丁语-1的人必须要应付乱码因为所有字符编码都支持拉丁语I。但是,其他国家(如中国、日本、印尼等)的用户却没有这么幸运。他们一直在努力解决编码问题,不仅是来自网页,还来自JavaScript:许多中文/日语字符被JavaScript视为两个字母,因此可能会在中间分开,导致以及(两个对最终用户毫无意义的问号)。如果我们可以开始为UTF-32做准备,那么TC39可能只允许浏览器做Python多年前所做的事情,这使得Pythons在处理高Unicode字符方面非常流行:使用UTF-32。

一致首字母大写在中正确工作Internet Explorer 3+(当常数已更改为变量).pretty大写首字母需要Internet Explorer 5.5+(请参阅第250页顶部这个文档)。然而,这些事实更多的是笑话,因为很可能你的网页上的其他代码都无法运行Internet Explorer 8-因为所有DOM和JScript错误以及这些旧浏览器中缺少功能。此外,没有人再使用Internet Explorer 3或Internet Explorer 5.5。

5
  • 2
    很高兴看到一个引起这种担忧的答案。然而,我不相信有任何浏览器字符串.fromCodePoint(65536).长度===1将是真的。ES字符串暴露其UTF16特性并不是特定于实现的行为——这是规范中定义良好的一部分,并且由于向后兼容而无法修复。
    – 分号
    2018年12月26日10:48
  • 2
    关于:新的最终注释,WHATWG和联合使用UTF-8作为平台上所有文本交换的唯一“正确”编码。这不会改变(这是一件好事)。然而,ES问题与此不同,它是关于ES具有字符串抽象,在使用索引地址、string.prototype.length等时,内部“utf-16+lone surrotates”编码的代码单元(既不是utf-16也不是UCS2)“breakthrough”(1/2)
    – 分号
    2019年4月25日20:54
  • 1
    负责ES的机构是TC39,而不是W3C(或WHATWG等),他们不能更改现有功能,因为这会破坏web。相反,他们可以引入行为正确的新功能。他们已经开始这样做了——RegExp、String.prototype.codePointAt和String.proptotype[@@iterator]上的“u”标志为旧API提供了更安全的替代方案。(2/2)
    – 分号
    2019年4月25日20:55
  • 哇-差不多5岁了,有很多编辑。它看起来真的很有用,但这段代码显然从未运行过。S公司一串?
    – dsl101
    2022年2月11日14:29
  • 虽然你可能是对的,(在你发帖时)没有其他答案正确地处理了这些字符,但问题这不是我要的。
    – 凯文·B
    2023年2月7日19:11
30
var str=“测试字符串”;str=str.substring(0,1).to UpperCase()+str.substring(1);
21

查看此解决方案:

var stringVal='master';stringVal.replace(/^./,stringVal[0].toUpperCase());//返回主控形状
2
  • 保存一些按键;)字符串值替换(/^./,字符串值[0].toUpperCase()); 2015年10月15日19:30
  • 2
    不必要时不应使用Regex。它效率极低,也不会使代码更简洁。此外,字符串值[0]将是未定义对于空字符串值,因此尝试访问属性.到UpperCase()将抛出错误。 2017年9月23日19:28
21

已经有很多好的答案,但您也可以使用简单的CSS转换:

文本转换:大写;

div.text大写{文本转换:大写;}
<h2>文本转换:大写:</h2><div class=“text-capitalize”>Lorem ipsum dolor sit amet,consectetur adipiscing精英</div(分频)>

4
21
yourString.replace(/^[a-z]/,函数(m){return m.toUpperCase()});

编辑:Regexp对此太过火了,最好使用更简单的:str.charAt(0).toUpperCase()+str.substring(1)

  • 5
    尽管这有相当多的选票,但这是迄今为止最慢的解决方案。我用这篇帖子中最流行的答案做了一个小小的速度测试,如下所示:forwebonly.com/… 2013年2月13日13:17
  • 1
    Regexp对此过于苛刻,更喜欢简单的:str.charAt(0).toUpperCase()+str.slice(1)
    – 西蒙
    2017年1月23日13:36
  • 1
    通常,如果您想用regex解决问题,最终会遇到两个问题。 2017年9月23日19:18

不是你想要的答案吗?浏览标记的其他问题问自己的问题.