在字符串中大写单词

vsy*_*ync 165 javascript string capitalization

将字符串中的单词大写的最佳方法是什么?

dis*_*ted 245

String.prototype.capitalize = function() {
    return this.replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); });
};
Run Code Online (Sandbox Code Playgroud)

用法:

'your string'.capitalize(); // -> 'Your String'
Run Code Online (Sandbox Code Playgroud)

ADD-ON我发现它很有用

String.prototype.capitalize = function(lower) {
    return (lower ? this.toLowerCase() : this).replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); });
};
'javaSCrIPT'.capitalize();      // -> 'JavaSCrIPT'
'javaSCrIPT'.capitalize(true);  // -> 'Javascript'
Run Code Online (Sandbox Code Playgroud)

  • regexp的作用类似于"将所有非空白字符(\ S)站在字符串的开头(^)或任何空格字符(\ s)后面并将它们大写" (4认同)
  • 处理大写字符串的一点改进:)**String.prototype.capitalize = function(){return this.toLowerCase().replace(/(?:^ |\s)\ S/g,function(a) {return a.toUpperCase();}); };** (3认同)

Ivo*_*Ivo 206

使用ES6的箭头函数,在字符串中大写单词的最短实现如下:

'your string'.replace(/\b\w/g, l => l.toUpperCase())
// => 'Your String'
Run Code Online (Sandbox Code Playgroud)

ES5兼容实现:

'your string'.replace(/\b\w/g, function(l){ return l.toUpperCase() })
// => 'Your String'
Run Code Online (Sandbox Code Playgroud)

正则表达式基本匹配给定字符串中每个单词的第一个字母,并仅将该字母转换为大写:

  • \ b匹配单词边界(单词的开头或结尾);
  • \ w匹配以下元字符[a-zA-Z0-9].

对于非ASCII字符,请参阅此解决方案

'ÿöur striñg'.replace(/(^|\s)\S/g, l => l.toUpperCase())
Run Code Online (Sandbox Code Playgroud)

此正则表达式匹配给定字符串中的第一个字母和前面有空格的每个非空格字母,并仅将该字母转换为大写:

  • \ s匹配空白字符
  • \ S匹配非空白字符
  • (x | y)匹配任何指定的替代

这里可以使用非捕获组,如下所示,/(?:^|\s)\S/g尽管g我们的正则表达式中的标志无论如何都不会按设计捕获子组.

干杯!

  • 来自@MarkusMeskanen的示例应该更改为"Päijät-Häme",但至少在Chrome中,空格不包括短划线( - ),因此名称的第二部分不是大写的.可以修改为`/(^ |\s | - )\ S/g`. (3认同)
  • 如果解释在其中,我将选择它作为答案而不是作为可能错过的评论. (2认同)
  • 这似乎不适用于北欧字符 ä、ö 和 å。例如,`päijät-häme` 变成了 `PäIjäT-HäMe` (2认同)
  • 对于包含变音符号/非拉丁字符的国际内容,此解决方案并不是一个好的解决方案。例如,“EisbäRen”就是结果之一。 (2认同)

vsy*_*ync 32

function capitalize(s){
    return s.toLowerCase().replace( /\b./g, function(a){ return a.toUpperCase(); } );
};

capitalize('this IS THE wOrst string eVeR');
Run Code Online (Sandbox Code Playgroud)

输出:"这是最糟糕的字符串"

更新:

看来这个解决方案取代了我的:https://stackoverflow.com/a/7592235/104380

  • 我不喜欢原型设计,它有可能产生碰撞,其他人也使用相同的名称来原型字符串. (9认同)

Mar*_*aio 15

只要输入字符串中没有重音字母,vsync提供答案就会起作用.

我不知道原因,但显然\b在正则表达式中也匹配重音字母(在IE8和Chrome上测试过),所以字符串"località"会被错误地大写转换成"LocalitÀ"(à字母变大写因为正则表达式认为它是单词边界)

一个更通用的功能,也适用于重音字母是这一个:

String.prototype.toCapitalize = function()
{ 
   return this.toLowerCase().replace(/^.|\s\S/g, function(a) { return a.toUpperCase(); });
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

alert( "hello località".toCapitalize() );
Run Code Online (Sandbox Code Playgroud)

  • 它可以关注的是:不满的答案http://stackoverflow.com/questions/2332811/capitalize-words-in-string/7592235#7592235现在是最好的答案. (2认同)

小智 7

一个简单、直接(非正则表达式)的解决方案:

const capitalizeFirstLetter = s => 
  s.split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')
Run Code Online (Sandbox Code Playgroud)
  1. 将字符串拆分成单词数组(通过空格分隔符)
  2. 将每个单词分解为单词中的第一个字符 + 其余字符
  3. 第一个字母转换为大写,其余保持原样
  4. 将 Array 连接回带空格的字符串


Big*_*ney 6

Ivo 的回答很好,但我更喜欢不匹配,\w因为不需要大写 0-9 和 AZ。我们可以忽略这些,只匹配 az。

'your string'.replace(/\b[a-z]/g, match => match.toUpperCase())
// => 'Your String'
Run Code Online (Sandbox Code Playgroud)

这是相同的输出,但我认为在自记录代码方面更清晰。

  • @vsync 看起来很苛刻。这是对已接受答案的优化。`/\b\w/g` 对于非英文字母也失败。不是每个人都处理 unicode 字符,这将帮助那些不想要的人。 (2认同)

Dav*_*und 5

由于每个人都给了您所要求的 JavaScript 答案,我将指出 CSS 属性text-transform: capitalize将完全做到这一点。

我意识到这可能不是你所要求的——你没有给我们任何运行它的上下文——但如果它只是为了演示,我肯定会选择 CSS 替代方案。


Eri*_*sui 5

我的解决方案:

\n\n
String.prototype.toCapital = function () {\n    return this.toLowerCase().split(' ').map(function (i) {\n        if (i.length > 2) {\n            return i.charAt(0).toUpperCase() + i.substr(1);\n        }\n\n        return i;\n    }).join(' ');\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

例子:

\n\n
'\xc3\xa1lL riGht'.toCapital();\n// Returns '\xc3\x81ll Right'\n
Run Code Online (Sandbox Code Playgroud)\n