797

有没有一种简单的方法将字符串转换为标题大小写?例如。史密斯成为约翰·史密斯.我不想找像这样复杂的东西John Resig的解决方案,只是(希望)某种一两个班轮。

5
  • 1
    有各种方法,我们有一些性能统计数据吗? 评论 2016年10月2日12:18
  • 1
    @Anubhav是的我们现在确实有一个基准 评论 2020年11月19日10:57
  • 2
    现在是2022年,浏览器仍然没有实现这一点的本机功能。 评论 2022年6月30日3:23
  • 1
    这样的外壳完全取决于语言/位置/文化。 评论 2022年8月10日20:54
  • 我希望解决方案的测试用例之一是“ComhráI mBáC le Seán Nguyen”——祝你好运!基本上,即使考虑到大量的机器学习资源,认为计算机可以完成所谓的“标题套管”的想法可能也是没有希望的。 评论 2022年8月10日21:11

69个答案69

重置为默认值
985

使用:

函数toTitleCase(str){返回str.replace(/\w\S*/g,text=>text.charAt(0).toUpperCase()+text.substring(1).toLowerCase();}const示例=“john smith”;log(`“${example}”变为“${toTitleCase(example)}”`);

交互式示例:

const输入=document.querySelector('[名称=“input”]');const输出=document.querySelector('[名称=“output”]');input.addEventListener('change',()=>{output.value=toTitleCase(输入值);});input.addEventListener('keyup',()=>{output.value=toTitleCase(输入值);});output.addEventListener('click',()=>output.select());函数toTitleCase(str){返回str.replace(/\w\S*/g,text=>text.charAt(0).toUpperCase()+text.substring(1).toLowerCase();}
<表格>输入:<br/><textarea name=“input”></textarea><br/>输出:<br/><textarea name=“output”只读></form>

25
  • 19
    谁能解释一下,为什么\带\ S*使用,而不是\w个+\w个*例如?我不知道,为什么你想包含除空格以外的任何内容,从而进行更改吉姆·鲍伯Jim-bob公司. 评论 2013年1月9日9:17
  • 5
    @马提契维酒\带\S*也导致了Jim-bob公司我们这边的问题。使用\w个*解决了这个问题。
    – 布克
    评论 2013年2月27日13:31
  • 16
    /([^\W_]+[^\s-]*)*/g解决了吉姆·鲍勃问题,即:吉姆博布 --> 吉姆·鲍伯 评论 2013年6月1日18:55
  • 27
    如果吉姆博布 --> 吉姆·鲍伯是你的愿望,你应该这样做/\b\w+/g。示例:str.replace(/\b\w+/g,函数{return s.charAt(0).to UpperCase()+s.substr(1).to LowerCase();}); 评论 2014年1月17日17:20
  • 8
    \带\S*使用而不是\w个+\w个*所以像这样的话不要不要修改为不要,但正如其他人指出的那样\带\S*导致连字符单词出现问题。 评论 2017年2月1日14:59
335

如果CSS解决方案满足您的需要,您可以应用文本转换控件的CSS样式:

文本转换:大写;

请注意,这将改变:
你好,世界你好,世界
你好,世界你好世界(无变化)
艾米莉·简·奥布莱恩艾米丽·简·奥布莱恩(不正确)
玛丽亚·冯·崔普玛丽亚·冯·特拉普(不正确)

14
  • 70
    -1.这个css有效,但并不像大多数人预期的那样有效,因为如果文本以大写字母开头,就没有效果。webmasterworld.com/forum83/7506.htm 评论 2011年8月23日17:37
  • 74
    JS在浏览器之外使用。 评论 2013年2月5日13:43
  • 16
    问题是:“有没有简单的方法将字符串转换为标题大小写?”。此答案不会转换字符串。这是应用于字符串之上的样式。 评论 2019年9月6日16:40
  • 24
    +1问题含糊不清,无法解释用例。也许他们本来想用JS转换字符串,但实际上CSS对他们更有效,就像我的情况一样。 评论 2020年4月10日4:41
  • 进退两难,“JavaScript”确实是个问题。
    – 最少
    评论 2020年4月24日19:06
236

一种稍微优雅的方式,适应了格雷格·迪恩的功能:

String.prototype.toPropertyCase=函数(){return this.replace(/\w\S*/g,function(txt){return txt.charAt(0).toUpperCase()+txt.substr(1).toLowerCase(;});};

可以这样称呼:

“pascal”.toPropertCase();
9
  • 5
    请记住,如果您有一个用户名中有破折号,并且用户输入了乔安·史密斯,此代码将它们转换为乔安·史密斯(注意小写在里面). 评论 2012年4月7日11:23
  • 20
    @daniellmb为什么他不应该改变字符串原型?我认为这是一个很好的解决方案。想想ruby开放类,将函数添加到现有类中是完全有效的,并且它被广泛接受。 评论 2012年9月21日15:31
  • 120
    @马可·菲塞特因为它和其他人玩得不好!当您有两个库都试图用不兼容的更改修改本机JavaScript对象时,就会发生不好的情况。想象一下,如果jQuery和GoogleMaps遵循这种设计模式,那么您不可能在同一个页面上同时拥有这两种功能。 评论 2012年9月21日17:28
  • 6
    @daniellmb一个很好的观点。在方法名前面加前缀应该有助于避免这种情况,因为这样会使方法不可枚举。 评论 2013年2月5日13:42
  • 71
    我觉得“不要修改本地JavaScript对象”语句就像“永远不要使用goto”或“eval是邪恶的”。很多情况下都可以。如果你对你的项目有完全的控制权,当然也不打算将其作为库发布,我认为这种方法没有问题。 评论 2015年6月23日9:15
189

这是我的版本,IMO它很容易理解,也很优雅。

const str=“foo bar baz”;const newStr=str.split(“”).map(w=>w[0].toUpperCase()+w.substring(1).toLowerCase(.join(“”);console.log(newStr);

10
  • 或者,您可以将映射中的子字符串小写:str.split('').map(i=>i[0].toUpperCase()+i.substring(1).toLowerCase()).join('') 评论 2016年8月15日16:39
  • 12
    我不同意打电话.to下壳体()。“McDonald”等名称或“ASAP”等首字母缩写词应保留大写字符。如果有人实际上传入了类似“heLLO”的字符串,应用程序不应假定大写字母不正确。 评论 2017年2月1日18:22
  • 1
    @托马斯·希金波坦这个怎么样?String.prototype.toTitleCase=函数(blnForceLower){var strReturn 评论 2017年2月2日16:26
  • 如果字符串是单个字符。 评论 2018年9月19日17:52
  • 2
    这看起来像是最快的解决方案:) 评论 2020年11月19日10:57
122

这是我的函数,它可以转换为标题大小写,但也可以将定义的首字母缩写词保留为大写,将次要单词保留为小写:

String.prototype.toTitleCase=函数(){var i,j,str,lowers,upper;str=this.replace(/([^\W_]+[^\s-]*)*/g,函数(txt){return txt.charAt(0).toUpperCase()+txt.substr(1).toLowerCase(;});//某些次要单词应保留小写,除非//它们是字符串中的第一个或最后一个单词lowers=['A','An','The','And','But','Or','For','Nor','As','At',‘By’、‘For’、’From’、‘In’、'Into’、‘Near’、‘Of’、‘On’、“Onto”、‘To’、'With’];对于(i=0,j=较低长度;i<j;i++)str=str.replace(新RegExp('\\s'+lowers[i]+'\\s`,'g'),函数(txt){return txt.toLowerCase();});//某些单词,如首字母缩写或首字母缩略词,应保留大写uppers=['Id','Tv'];对于(i=0,j=上部长度;i<j;i++)str=str.replace(新RegExp('\\b'+上标[i]+'\\b`,'g'),uppers[i].toUpperCase());返回str;}

例如:

“若要登录此网站并观看电视,请输入有效的id:”.toTitleCase();//返回:“要登录此网站并观看电视,请输入有效ID:”
11
  • 1
    我喜欢你的,我在处理罗马数字时也会遇到问题。。。只是用I、II、III、IV等进行了修补。
    – 马塞洛
    评论 2011年8月21日0:19
  • 2
    固定的。第三行中的正则表达式已从/\w\S*/g/([^\W_]+[^\s-]*)*/g根据@awashburn的上述评论来解决这个问题。 评论 2013年6月4日15:49
  • 2
    使用正则表达式模式是否比使用正则表达式有优势/\b\w+/g,我觉得哪个更容易理解? 评论 2014年5月27日21:14
  • 2
    我看不出来,我只是采纳了另一位评论员的建议来解决连字符问题;但您的regex似乎也做得很好,而且简单性总是更好。对于后人和未来的读者,我只是将第三行中的regex从/([^\W_]+[^\s-]*)*/g/\b\w+/g根据@Michael的评论;如果您发现需要更复杂的正则表达式,请发表评论。 评论 2014年5月28日14:30
  • 1
    我将第三行正则表达式更改为/\b[\w-\']+/g为了在单词中允许连字符和撇号。 评论 2014年7月3日14:48
64

你可以立即小写字符串,然后将字符串转换成大写每个单词的第一个字母。变成一个非常简单的线性:

函数titleCase(str){return str.toLowerCase().replace(/\b\w/g,s=>s.toUpperCase(());}console.log(titleCase('iron man'));console.log(titleCase('iNcrEdible hulK'));

8
  • 我喜欢这个解决方案;又好又简单。但看起来你的答案中有一点CoffeeScript(s=>s.toUpperCase()). 我的变种是做您已经做过的事情,但扩展String对象(尽管有争议):Object.defineProperty(String.prototype,'_toPropertyCase',{value:function(){return this.toLowerCase().replace(/\b(\w)/g,function
    – 瓦兹
    评论 2017年4月21日9:14
  • 1
    @哇,谢谢你的主意!只是想澄清一下=>,这是一个本机箭头函数(ES6),链接跳转到它们上的Mozilla Docs,它还提供了一个支持表。 评论 2017年4月21日15:27
  • 2
    string=>string.toLowerCase().replace(/\b\w/g,word_head=>word_head.toUpperCase(());。无需对\w个; 被替换的是\b\w(黑白)哪里\b条不是字符串。 评论 2022年5月27日18:13
  • 1
    正如@КонстантинВаат所说,没有基团,求解速度要快得多 评论 2022年6月28日10:36
  • 1
    @谢谢你的反馈!我已经执行了你的建议。我看了一些基准测试来找出差异,你是对的,它要快得多。 评论 2022年6月28日19:49
62

与其他答案相比,我更喜欢以下答案。它只匹配每个单词的第一个字母并将其大写。代码更简单,更容易阅读,字节更少。它保留了现有的大写字母,以防止首字母缩写的扭曲。不过你可以随时打电话至下壳体()先在你的绳子上。

函数标题(str){return str.replace(/(^|\s)\s/g,函数(t){return t.toUpperCase()});}

您可以将其添加到字符串原型中,这将允许您“我的字符串”.toTitle()如下:

String.prototype.toTitle=函数(){return this.replace(/(^|\s)\s/g,函数(t){return t.toUpperCase()});}

例子:

String.prototype.toTitle=函数(){return this.replace(/(^|\s)\s/g,函数(t){return t.toUpperCase()});}console.log('all小写->','all小写'.toTitle());console.log(“全部大写->”,“全部大写”.toTitle());console.log(“我是小茶壶->”,“我是一个小茶壶”.toTitle());

10
  • 6
    它甚至比羔羊还要好const titleCase=(str)=>str.replace(/\b\S/g,t=>t.toUpperCase()); 评论 2018年3月4日16:15
  • 我不想破坏IE,但是的,如果应用程序不是对浏览器敏感的,它可能会更短。 评论 2018年3月5日15:47
  • 这只是一个部分解决方案-op询问如何将字符串转换为标题大小写。对于像这样的输入,这个答案无法实现这一点数量. 评论 2018年9月18日17:36
  • @Madbreaks该问题没有规定混合大小写输入应该转换。然而,我更新了答案,提到小写请注意,这会破坏缩写词。HTML文档:HTML文档Html文档 评论 2018年9月19日10:22
  • 7
    @Madbreaks虽然你最初的例子是人为设计的,但你很好地说明了如果投入资本化,产出将保持不变。话虽如此,我觉得答案是肯定的(编辑建议小写)比假设开发人员的意图更灵活/更有用。此方法还反映了其他语言(如PHP)类似内置方法的功能(ucwords(ucwords))和Golang(串。标题). .净值(文本信息。ToTitleCase(ToTitle大小写))有趣的是,它适用于混合情况,但也会保持完全大写的字符串不变。 评论 2018年9月19日16:16
42

基准

TL;博士

此基准测试的获胜者是普通的旧for循环:

函数titleize(str){let upper=真让newStr=“”for(设i=0,l=str.length;i<l;i++){//请注意,您还可以使用//str[i].match(/\s/)如果(str[i]==“”){上限=真newStr+=str[i]持续}newStr+=上部?str[i].to上箱():str[i].to下箱()上限=假}返回newStr}//注意:我想您可以使用字符码和字符串生成器来克服这个问题。

细节

我采用了最流行、最独特的答案基准用这些。

以下是我的MacBook专业版的结果:

在此处输入图像描述

为了完整起见,以下是使用的函数:

str=“快跑狐狸jUMPS oR懒惰狗”;函数正则表达式(str){返回str.replace(/\w\S*/g,函数(txt){return txt.charAt(0).toUpperCase()+txt.substr(1).toLowerCase(;});}函数拆分(str){返回字符串。拆分(“”)。映射(w=>w[0].toUpperCase()+w.substr(1).toLowerCase(。连接(“”);}功能完成(str){var i,j,str,lowers,upper;str=str.replace(/([^\W_]+[^\s-]*)*/g,函数(txt){return txt.charAt(0).toUpperCase()+txt.substr(1).toLowerCase();});//某些次要单词应保留小写,除非//它们是字符串中的第一个或最后一个单词lowers=['A','An','The','And','But','Or','For','Nor','As','At',‘By’、‘For’、’From’、‘In’、'Into’、‘Near’、‘Of’、‘On’、“Onto”、‘To’、'With’];对于(i=0,j=较低长度;i<j;i++)str=str.replace(新RegExp('\\s'+lowers[i]+'\\s`,'g'),函数(txt){return txt.toLowerCase();});//某些单词,如首字母缩写或首字母缩略词,应保留大写uppers=['Id','Tv'];对于(i=0,j=上部长度;i<j;i++)str=str.replace(新RegExp('\\b'+上标[i]+'\\b`,'g'),uppers[i].toUpperCase());返回str;}函数firstLetterOnly(str){return str.replace(/\b(\S)/g,函数(t){return t.toUpperCase();});}循环函数(str){设上限=真;让newStr=“”;for(设i=0,l=str.length;i<l;i++){如果(str[i]==“”){上限=真;newStr+=“”;继续;}newStr+=上部?str[i].to上箱():str[i].to下箱();上限=错误;}返回newStr;}

请注意,我故意没有改变原型,因为我认为这是一个非常糟糕的实践,我认为我们不应该在我们的答案中推广这种实践。只有当您是唯一一个处理小代码基的人时,这才可以。

如果你想在这个基准测试中添加任何其他方法,请评论答案的链接!


编辑2022 Mac M1:在我的新电脑上,使用最新的chrome,分裂获胜。如果你真的关心特定机器上的性能,你应该自己运行基准测试

6
  • 1
    “仅第一个字母”方法中的括号组不会被使用,如果删除它们,则此方法将击败regex方法,因为这是有意义的。 评论 2022年6月28日1:11
  • 1
    str.toLowerCase().replace(/\b\S/g,函数(t){return t.toUpperCase(;});还赢得了regex方法并获得了相同的结果 评论 2022年6月28日1:14
  • 显著改善了完成方法:jsben.ch/yTK3Y 评论 2022年6月28日2:01
  • 1
    @我不得不承认,我在基准测试中直接聚合了其他答案。因此,请随意编辑我的答案,我建议您也直接评论相关答案:) 评论 2022年6月28日7:47
  • 当我进行同样的基准测试时,这种分歧似乎胜过其他人。 评论 6月18日4:22
26

var结果=“这很有趣”.replace(/\b[a-z]/g,(x)=>x.toUpperCase())log(result)//这很有趣

6
  • 只是一个问题,()构造用于指定任何一个选项序列的匹配:即(a|b)匹配a或b。构造(.)做什么? 评论 2014年12月30日21:17
  • 对于任何有相同问题的人,它定义了替换部分中使用的替换“blob”。blob按顺序编号,第一个()放入$1,第二个放入$2。我发现这个网站很有用:javascript.info/tutorial/regular-expressions方法 评论 2014年12月30日21:34
  • 我无法实现上述功能,但我远非正则表达式向导。我在用“string”.replace(/^(.)(.*)/,函数(s,p1,p2){return p1.toUpperCase()+p2;})同样,这只适用于大写字符串的第一个字母,但如果这正是您所需要的,我的构造也适用。 评论 2014年12月30日21:39
  • 1
    由于某种原因,FF35似乎被卡住了“$1”.toUpperCase(),似乎在赋值时大写尚未完成。使用函数解决问题“string”.replace(/^(.){1}/,函数(match){return match.toUpperCase();}) 评论 2015年1月25日23:20
  • 大家好,答案是固定的!我很确定在我最初发布它的时候它是有效的。无论如何,谢谢你的输入!
    – 西蒙
    评论 2016年5月18日12:28
26

惊讶地发现没有人提到rest参数的用法。下面是一个使用ES6 Rest参数的简单单行程序。

让str=“john smith”str=str.split(“”).map(([firstChar,…rest])=>firstChar.toUpperCase()+rest.join(“”控制台.log(str)

2
  • 我很欣赏这个解决方案,并决定这是适合我预期用途的最佳代码。我注意到了不考虑使用连字符以名字命名。这对我目前的使用没有太大影响;然而,我想知道如何根据这种考虑调整此代码。再次感谢您的解决方案! 评论 2022年10月5日16:43
  • 这个实现相当于Python函数string.capwords(s,sep=无). 评论 2023年4月23日22:39
21

不使用正则表达式仅供参考:

String.prototype.toPropertyCase=函数(){var words=this.split('');var结果=[];for(var i=0;i<words.length;i++){var letter=单词[i].charAt(0).toUpperCase();结果:push(字母+单词[i].slice(1));}return results.join(“”);};控制台.log(“约翰·史密斯”.toPropertCase())

2
  • 感谢无正则表达式的解决方案! 评论 2019年10月22日14:22
  • 这对“džungla”不起作用。 评论 2023年8月31日7:13
18

如果你担心这些填充词,你可以告诉函数什么不应该大写。

/***@param String str要转换为titleCase的文本。*@param数组将单词粘贴为小写。*/var titleCase=函数(str,glue){胶水=(胶水)?胶水:['of'、'for'、'和'];return str.replace(/(\w)(\w*)/g,函数(_,i,r){var j=i.到UpperCase()+(r!=空?r:“”);return(glue.indexOf(j.toLowerCase())<0)?j: j.至下壳体();});};

希望这能帮到你。

编辑

如果您想处理前导粘连词,您可以跟踪这个w/另一个变量:

var titleCase=函数(str,glue){胶水=!!胶水?胶水:['of','for','and','a'];var first=true;return str.replace(/(\w)(\w*)/g,函数(_,i,r){var j=i.toUpperCase()+(r!=null?r:'').toLowerCase(;var结果=((glue.indexOf(j.toLowerCase())<0)||第一个)?j:j.到LowerCase();first=false;返回结果;});};
6
  • 2
    可以将字符串分解为数组。所以我们可以使用葡萄牙语、西班牙语、意大利语和法语介词:glue='de|da|del|dos|do|das|des|la|della|delli'.split('|'); 评论 2012年6月25日23:58
  • 这不能确保第一个单词的大写;还有一件事成为还有另一件事。只需要一种优雅的方式来始终大写第一个单词。 评论 2013年4月30日14:41
  • @BradKoch-用空格填充,以便您使用“and”、“de”等作为搜索词,然后“and Another and Anether”将替换为“and Another and Anothers”。 评论 2015年9月4日13:19
  • 很好,除了它还大写‘和’后面的文本,像H'Dy或Number-One
    – 鲁基
    评论 2019年7月13日14:41
  • 不使用三元运算符,您可以使用回退:glue=glue||['of','for','and','a']; 评论 2019年11月7日14:42
18

如果你需要一个语法正确的答案:

这个答案考虑了“of”、“from”、…等介词。。输出将生成一个编辑风格的标题,您可以在论文中看到。

toTitleCase函数

考虑语法规则的函数此处列出.该函数还合并空白并删除特殊字符(根据需要修改正则表达式)

const to TitleCase=(str)=>{const articles=['a','an','the'];const连词=['for','and','nor','but','or','yet','so'];常量介词=[“with”、“at”、“from”、“into”、“on”、“of”、“to”、“in”、“for”、,“on”、“by”、“like”、“over”、“plus”、“but”、“up”、“down”、“off”、“near”];//可以在此处调整空间字符列表const replaceCharsWithSpace=(str)=>str.replace(/[^0-9a-z&//\\]/gi,'').replate(/(\s\s+)/gi,'');常量大写首字母=(str)=>str.charAt(0).toUpperCase()+str.substr(1);const normalizeStr=(str)=>str.toLowerCase().trim();const should Capitalize=(单词,fullWordList,posWithinStr)=>{if((posWithinStr==0)||(posWithinStr==fullWordList.length-1)){返回true;}返回!(articles.includes(word)连接词.includes(word,词)介词.incrudes(词));}str=replaceCharsWithSpace(str);str=标准化str(str);let words=str.split(“”);if(words.length<=2){//长度小于3个单词的字符串应始终首字母大写words=words.map(w=>大写首字母(w));}其他{for(设i=0;i<words.length;i++){words[i]=(是否应大写(words[i],words,i)?大写首字母(单词[i],单词,i):单词[i');}}return words.join('');}

确保正确性的单元测试

从'chai'导入{expect};从'../..导入{toTitleCase}/src/lib/stringHelper“;description('toTitleCase',()=>{it('如果字符串长度不超过两个单词,则不考虑冠词、连词或介词,将每个单词的第一个字母大写',function(){expect(toTitleCase('the dog')).to.equal('the dog');//只有两个单词长时,文章大写expect(toTitleCase('for all')).to.equal('for all');//只有两个单词长时将连词大写expect(toTitleCase('with cats')).to.equal('with cats');//只有两个单词长时,介词大写});it('无论冠词、连词或介词如何,始终大写字符串中的第一个和最后一个单词',function(){expect(to TitleCase(“漂亮的狗”))to.equal(“漂亮狗”);expect(toTitleCase(“对于所有致命的忍者,尽管如此”).to.equal(“对于一切致命的忍忍者,就这样吧”);expect(toTitleCase(“与猫和狗在一起我们很近”).to.equal(“与猫猫和狗一起我们很接近”);});it('用空格替换特殊字符',function(){expect(toTitleCase(“[狼和狮子]:小心”).to.equal(“狼和狮子要小心”);expect(to TitleCase(“狼和狮子,小心点”))to.equal(“狼与狮子,小心”);});it('在开头和结尾处去掉空格',function(){expect(toTitleCase(“马里奥和路易吉超级巨星传奇”).to.equal(“马里奥和路易基超级巨星系列”);});it('冠词、连词和介词不应在3个以上单词的字符串中大写',function(){expect(to TitleCase(《狼和狮子:两个相似动物的故事》)to。equal(《狼与狮子:两种相似动物的传说》);期望(toTitleCase(“三名枪手及以上”)等于(“三位枪手及以下”);});});

请注意,我正在从提供的字符串中删除相当多的特殊字符。您需要调整正则表达式以满足项目的要求。

5
14

如果上述解决方案中使用的正则表达式让您感到困惑,请尝试以下代码:

函数titleCase(str){返回str.split(“”).map(函数(val){返回val.charAt(0).toUpperCase()+val.substr(1).toLowerCase(;}).join(“”);}
6
  • 喜欢它!没有到数组的转换。 评论 2016年4月29日5:03
  • 1
    嗯。。。分裂 将其转换为数组,您只是看不到它的明显性,因为地图意味着你不必使用[]符号 评论 2016年7月21日12:05
  • 这与8m的答案从2年前开始。 评论 2017年8月15日14:42
  • 1
    单字符输入的中断。 评论 2018年9月19日17:51
  • 1
    @AlexChaffee检查修订历史记录。a8m在最初的答案中没有使用箭头功能。
    – 木兰
    评论 2018年11月13日14:42
13

我创建了这个函数,可以处理姓氏(因此它不是标题大小写),例如“McDonald”或“MacDonald“或“O’Toole”或“D’Orazio”。然而,它不处理德语或荷兰语名称中的“van”或“von”,它们通常是小写的。。。我相信“de”通常也是小写的,比如“Robert de Niro”。这些问题仍需解决。

函数到PropertCase{返回s.toLowerCase()。替换(/\b(m)(a?c))?(\w)/g,函数($1,$2,$3,$4,$5){if($2){return$3.toUpperCase()+$4+$5.toUpperCase();}return$1.toUpperCase();{);}
  • 1
    +1表示名称意识。但也不能正确处理“macy”。 评论 2013年6月26日0:35
  • 这是唯一正确处理大小写转换为正确大小写的函数,它注意到了“美属维尔京群岛”等缩写。 评论 2016年8月6日6:15
  • 你可以绕过梅西百货问题是,在那里放一个负面的展望\b((m)(a?c))?(\w)成为\b((m)(a?c))?(\w)(?!\s)
    – Ste公司
    评论 2019年11月8日14:53
11

大多数答案似乎忽略了使用单词边界元字符(\b)的可能性。格雷格·迪恩(Greg Dean)的答案的简短版本:

函数toTitleCase(str){return str.replace(/\b\w/g,函数(txt){return txt.toUpperCase();});}

也适用于连字符名称,如Jim-Bob。

  • 是一个优雅的部分解决方案,但不适用于重音或大写字符串。我得到了“Sofía Vergara”=>“Sofía Vergara”或“Sofía Vergara”=>“Sofía Vergara”。第二种情况可以使用apply.toLowerCase()函数在.replace(…)之前解决。第一种情况需要找到正确的正则表达式。 评论 2014年9月30日18:31
  • 2
    嗯,这似乎是regex实现中的一个错误,我认为重音字符应该是单词字符(不过您是正确的,因为它不适用于这些情况)。 评论 2014年10月1日23:20
  • 1
    \w个仅包括字符[A-Za-z0-9_],并非所有字母。为此,您需要使用Unicode类别\p{L}。您需要/u个修改器(请参见在这里)和不同的解决方案\b条,仅在以下两者之间有效\W公司\w个(请参见在这里) 评论 2019年11月13日0:16
11

首先,转换您的一串到数组中分裂以空格表示:

var words=str.split(“”);

然后使用阵列.map创建包含大写单词的新数组。

var大写=words.map(函数(word){return word.charAt(0).toUpperCase()+word.substring(1,word.length);});

然后参加带有空格的新数组:

大写。join(“”);

函数titleCase(str){str=str.toLowerCase()//确保HeLlo在最后变成HeLlovar words=str.split(“”);var大写=words.map(函数(word){return word.charAt(0).toUpperCase()+word.substring(1,word.length);});return大写。join(“”);}log(titleCase(“我是一个小茶壶”);

注:

这当然有一个缺点。这只会将每个单词的第一个字母大写。通过单词,这意味着它将每个由空格分隔的字符串视为一个单词。

假设您有:

str=“我是一个小茶壶”;

这将产生

我有点/小的茶壶

与预期相比

我是一个小茶壶

在这种情况下,使用Regex和.更换将完成以下操作:

使用ES6:

常量大写=str=>str.length? str[0].toUpperCase()+str.slice(1).to下层(): '';常量转义=str=>str.replace(/./g,c=>`\\${c}`);const titleCase=(句子,seps='_-/')=>{let wordPattern=新RegExp(`[^${escape(seps)}]+`,'g');返回句子.replace(wordPattern,大写);};log(titleCase(“我是一个小茶壶。”);

或不带欧洲标准6:

函数大写(str){return str.charAt(0).toUpperCase()+str.substring(1,str.length).toLowerCase(,);}函数titleCase(str){return str.replace(/[^\\/\-\_]+/g,大写);}log(titleCase(“我是一个小茶壶。”);

2
  • 这对“džungla”不起作用。 评论 2023年8月31日7:14
  • @user3840170,你能详细说明吗?哪一个不起作用?什么是“džungla”? 评论 2023年9月3日19:45
10

如果您可以在代码中使用第三方库,那么lodash为我们提供了一个帮助函数。

https://lodash.com/docs/4.17.3#startCase

_.startCase('foo bar');//=>“Foo酒吧”_.startCase(“--foo-bar”);//=>“Foo酒吧”_.startCase('fooBar');//=>“Foo酒吧”_.startCase('__FOO_BAR__');//=>“FOO酒吧”

1
  • 启动案例在去除琴弦毛刺方面也很有侵略性。例如法国ais>法国人葡萄牙语(巴西)'>葡萄牙语(巴西)
    – 卡诺
    评论 4月23日11:06
10

西班牙6

str.split(“”).map(s=>s.slice(0,1).toUpperCase()+s.slice.join(“”)

其他的

str.split(“”).map(函数){返回s.slice(0,1).toUpperCase()+s.slice;}).join(“”)
6
  • 只是一个警告,应该是s.slice(0,1).toUpperCase()如果你还想要第一个字母。 评论 2016年11月13日1:00
  • @您还应该更正ES6中的代码。 评论 2016年12月20日2:09
  • 1
    断开,如果字符串是单个字符 评论 2018年9月19日18:05
  • @jssridhar可能对我们更好.charAt(0).toUpperCase(). 评论 2018年10月5日12:27
  • 8m答案的副本
    – 木兰
    评论 2018年11月13日14:45
8
var toMatch=“john w.smith”;var result=toMatch.replace(/(\w)(\w*)/g,函数(_,i,r){返回i.toUpperCase()+(r!=空?r:“”);})

似乎有效。。。通过以上测试,“快速成长的狐狸?/跳过^懒惰的狗…”和“C:/program files/some vendor/their 2nd application/a file1.txt”。

如果您想要2Nd而不是2Nd,您可以更改为/([a-z])(\w*)/g.

第一种形式可以简化为:

函数toTitleCase(转换){返回Transform.replace(/\b([a-z])/g,函数(_,initial){return initial.toUpperCase();});}
8

试试这个最短的方法:

str.replace(/(^[a-z])|(\s+[a-z')/g,txt=>txt.toUpperCase());
1
  • 这太甜蜜了。对于我的基本用例(在性能不一定是优先考虑的情况下),这非常好!
    – 科菲
    评论 2021年7月13日11:06
8

吉姆-鲍勃->吉姆-鲍勃

吉姆/鲍勃->吉姆/鲍勃

jim_bob->jim_bob

不是->不是

法国高等学校->法国高等学校

麦当劳->麦当劳

函数toTitleCase(str){return str.replace(/\p{L}+('\p{L}+)/gu,函数(txt){return txt.charAt(0).toUpperCase()+txt.slice(1)})}
1
  • 1
    我认为这个解决方案值得更多的支持 评论 4月3日5:40
6

使用/\标准+/g支持变音符号:

函数到TitleCase(str){return str.replace(/\S+/g,str=>str.charAt(0).toUpperCase()+str.substr(1).toLowerCase(;}log(toTitleCase(“一个名为örebro的城市”);//一座名叫厄勒布罗的城市

然而:“不倾斜(ellow)“⇒”S公司不倾斜(ellow)“

6
“john f.kennedy”.替换(/\b\S/g,t=>t.到UpperCase())
  • 2
    样品和欧亨利但会做一些奇怪的事情马的嘴. 评论 2019年6月24日17:46
  • “john f.kennEdy”.toLowerCase().替换(/\b\S/g,t=>t.toUpperCase(())更好🤔 评论 2020年2月6日22:28
  • 不想编辑@Proximo的答案:\b条\S公司都很特别字符类表示“单词边界”和“单个非空白字符”。因此,regex匹配单词边界后面的每个字符,并通过应用给定的箭头函数将该字符大写。
    – 延斯
    评论 2020年2月28日11:14
5

试试这个

String.prototype.toPropertyCase=函数(){返回this.toLowerCase().replace(/(^[a-z]|[a-z]|-[a-z')/g,函数($1){return$1.toUpperCase();});};

例子

var str='john smith';字符串到属性用例();
0
5

这是我的函数,用于处理重音字符(对法语很重要!),可以打开/关闭lower异常的处理。希望能有所帮助。

String.prototype.titlecase=函数(lang,withLowers=false){var i,字符串,下,上;字符串=this.replace(/([^\s:\-'])([^.s:\-']*)/g,函数(txt){return txt.charAt(0).toUpperCase()+txt.substr(1).toLowerCase(;}).替换(/Mc(.)/g,函数(match,next){return'Mc'+next.toUpperCase();});if(带下限){if(lang=='EN'){lowers=['A','An','The','At','By','For','In','Of','On','To','Up','And','As','But','Or','Nor','Not'];}其他{lowers=['Un','Une','Le','La','Les','Du','De','Des','alo','Au','Aux','Par','Pour','Dans','Sur','Et','Comme','Mais',''Ou','Ne','Ni','Pas'];}对于(i=0;i<lowers.length;i++){string=string.replace(新RegExp('\\s'+lowers[i]+'\\s],'g'),函数(txt){return txt.toLowerCase();});}}uppers=['Id','R&d'];对于(i=0;i<uppers.length;i++){string=string.replace(new RegExp('\\b'+uppers[i]+'\\b','g'),uppers[i].toUpperCase());}返回字符串;}
5

我认为最简单的是使用css。

函数format_str(str){str=str.toLowerCase();return'<span style=“text-transform:capitalie”>'+str+'</span>';}
  • 我更新了代码并进行了测试。现在应该可以工作了。 评论 2018年8月4日16:54
  • 您只能在使用JS的一小部分环境中使用CSS,因此此解决方案不可行。此外,应不惜一切代价避免使用内联样式。 评论 2018年9月19日18:09
  • @史蒂夫,会过去吗至下壳体()? 评论 2020年8月28日0:47
5

这里有另一个使用css(和javascript,如果要转换的文本是大写的)的解决方案:

html格式

约翰·史密斯</span>

js型

var str=document.getElementById('text').innerHtml;var return_text=str.toLowerCase();

css公司

#text{text-transform:大写;}
5

下面是一个非常简单简洁的ES6函数:

const titleCase=(str)=>{return str.replace(/\w\S*/g,(t)=>{return t.charAt(0).toUpperCase()+t.substr(1).toLowerCase(()});}导出默认titleCase;

包含在公用事业文件夹,使用如下:

从'导入titleCase/utilities/titleCase.js';const string=“我的标题&string”;console.log(titleCase(字符串));//->'我的标题和字符串'
1
  • 我不建议使用Lodash的startCase,因为它去掉了像“&”这样的字符 评论 2020年11月19日10:40
5

我已经为土耳其语测试了这个解决方案,它也适用于特殊字符。

函数到TitleCase(str){return str.toLocaleLowerCase().replace(/(^|u |ü|ö|sh | Jo |ç| I |Ø|Ö| \w)\S*/g,(txt)=>txt.charAt(0).toLocaleUpperCase()+txt.substring(1),)}console.log(到TitleCase(“ISMA I L HAKKI”))console.log(到TitleCase('R AHMARAN B I NB I R GECE MASALLARI'))console.log(到TitleCase(“EKNOLOJ IüRüNü”)

我在开头添加了“toLocaleLowerCase”,因为我有所有的大写数据。如果你不需要它,你可以丢弃它。

使用区域设置操作对非英语语言很重要。

6
  • 选择的答案有错误。这样更好。
    – 比利
    评论 2022年1月26日21:33
  • toTitleCase(“TEKNOLOJÜRÜNÜ”)正在返回Teknoloji̇üRünü.Fyi(法语)。 评论 2022年5月4日8:19
  • @Ozgun Senyuva谢谢你。我已经编辑了我的答案来解决这个问题。
    – 凯雷姆
    评论 2022年6月13日13:24
  • “使用语言环境操作对非英语语言很重要”,但您的解决方案忽略了语言环境操作。您认为需要操作的字符位于char(0)是不正确的。例如,您需要一个测试用例来检查“oifig na bpasanna”的正确转换是否为“oifig na bpasanna”-“oifig-na bpasanna”甚至不接近正确。您也不能对单个字符执行LocaleUpperCase;它就是不起作用。例如,OIFIG NA bPASANNA(注意“b”)都是大写的:commons.wikimedia.org/wiki/File:ALLCAPS_OIFIG_NA_bPASANNA。JPG格式 评论 2022年8月10日20:56
  • “džungla”不起作用。 评论 2023年9月2日11:06

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