有没有一种简单的方法将字符串转换为标题案例?我john smith
变成了John Smith
.我不是在寻找像John Resig这样复杂的解决方案,只是(希望)某种单线或双线.
试试这个:
function toTitleCase(str) {
return str.replace(
/\w\S*/g,
function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
}
);
}
一种稍微优雅的方式,适应Greg Dean的功能:
String.prototype.toProperCase = function () { return this.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); };
称之为:
"pascal".toProperCase();
尝试将文本转换 CSS样式应用于控件.
例如: (text-transform: capitalize);
只在绝对必要时才使用JS方法.
这是我的版本,IMO也很容易理解和优雅.
var str = "foo bar baz"
console.log(
str.split(' ')
.map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())
.join(' ')
)
// returns "Foo Bar Baz"
这是我的函数,它转换为标题大小写,但也保留定义的首字母缩略词作为大写和小写单词作为小写:
String.prototype.toTitleCase = function() { var i, j, str, lowers, uppers; str = this.replace(/([^\W_]+[^\s-]*) */g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); }); // Certain minor words should be left lowercase unless // they are the first or last words in the string lowers = ['A', 'An', 'The', 'And', 'But', 'Or', 'For', 'Nor', 'As', 'At', 'By', 'For', 'From', 'In', 'Into', 'Near', 'Of', 'On', 'Onto', 'To', 'With']; for (i = 0, j = lowers.length; i < j; i++) str = str.replace(new RegExp('\\s' + lowers[i] + '\\s', 'g'), function(txt) { return txt.toLowerCase(); }); // Certain words such as initialisms or acronyms should be left uppercase uppers = ['Id', 'Tv']; for (i = 0, j = uppers.length; i < j; i++) str = str.replace(new RegExp('\\b' + uppers[i] + '\\b', 'g'), uppers[i].toUpperCase()); return str; }
例如:
"TO LOGIN TO THIS SITE and watch tv, please enter a valid id:".toTitleCase(); // Returns: "To Login to This Site and Watch TV, Please Enter a Valid ID:"
我更喜欢以下其他答案.它只匹配每个单词的第一个字母并将其大写.更简单的代码,更易于阅读和更少的字节.它保留现有的大写字母以防止扭曲缩写词.但是你总是可以toLowerCase()
先调用你的字符串.
function title(str) { return str.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() }); }
您可以将其添加到您的字符串原型中,这将允许您'my string'.toTitle()
按如下方式:
String.prototype.toTitle = function() { return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() }); }
不使用正则表达式仅供参考:
String.prototype.toProperCase = function() {
var words = this.split(' ');
var results = [];
for (var i = 0; i < words.length; i++) {
var letter = words[i].charAt(0).toUpperCase();
results.push(letter + words[i].slice(1));
}
return results.join(' ');
};
console.log(
'john smith'.toProperCase()
)
如果您担心这些填充词,您可以随时告诉函数什么不要大写.
/** * @param String str The text to be converted to titleCase. * @param Array glue the words to leave in lowercase. */ var titleCase = function(str, glue){ glue = (glue) ? glue : ['of', 'for', 'and']; return str.replace(/(\w)(\w*)/g, function(_, i, r){ var j = i.toUpperCase() + (r != null ? r : ""); return (glue.indexOf(j.toLowerCase())<0)?j:j.toLowerCase(); }); };
希望这可以帮助你.
如果你想处理领先的胶水词,你可以跟踪这个w /还有一个变量:
var titleCase = function(str, glue){ glue = !!glue ? glue : ['of', 'for', 'and', 'a']; var first = true; return str.replace(/(\w)(\w*)/g, function(_, i, r) { var j = i.toUpperCase() + (r != null ? r : '').toLowerCase(); var result = ((glue.indexOf(j.toLowerCase()) < 0) || first) ? j : j.toLowerCase(); first = false; return result; }); };
这仅适用于一个单词字符串,但这就是我需要的:
var result =
'this is very interesting'.replace(/\b[a-z]/g, (x) => x.toUpperCase())
console.log(result) // This Is Very Interesting
JSFiddle: https ://jsfiddle.net/simo/gou2uhLm/
如果上述解决方案中使用的正则表达式让您感到困惑,请尝试以下代码:
function titleCase(str) { return str.split(' ').map(function(val){ return val.charAt(0).toUpperCase() + val.substr(1).toLowerCase(); }).join(' '); }
你可以立即toLowerCase
使用字符串,然后只是toUpperCase
每个单词的第一个字母.成为一个非常简单的1班轮:
function titleCase(str) {
return str.toLowerCase().replace(/\b(\w)/g, s => s.toUpperCase());
}
console.log(titleCase('iron man'));
console.log(titleCase('iNcrEdible hulK'));
我做了这个功能,可以处理姓氏(所以它不是标题案例),如"麦当劳"或"麦当劳"或"奥图尔"或"D'Orazio".然而,它并不处理带有"van"或"von"的德语或荷兰语名称,这些名称通常是小写的......我认为"de"通常也是小写,例如"Robert de Niro".这些仍然需要解决.
function toProperCase(s) { return s.toLowerCase().replace( /\b((m)(a?c))?(\w)/g, function($1, $2, $3, $4, $5) { if($2){return $3.toUpperCase()+$4+$5.toUpperCase();} return $1.toUpperCase(); }); }
var toMatch = "john w. smith"; var result = toMatch.replace(/(\w)(\w*)/g, function (_, i, r) { return i.toUpperCase() + (r != null ? r : ""); } )
似乎工作......用上面的测试,"快速的棕色,狐狸?/跳跃/ ^超过'懒惰!狗..."和"C:/程序文件/一些供应商/他们的第二个应用程序/ a FILE1.TXT".
如果你想要2Nd而不是2nd,你可以改为/([a-z])(\w*)/g
.
第一种形式可以简化为:
function toTitleCase(toTransform) { return toTransform.replace(/\b([a-z])/g, function (_, initial) { return initial.toUpperCase(); }); }
试试这个
String.prototype.toProperCase = function(){ return this.toLowerCase().replace(/(^[a-z]| [a-z]|-[a-z])/g, function($1){ return $1.toUpperCase(); } ); };
例
var str = 'john smith'; str.toProperCase();
ES 6
str.split(' ') .map(s => s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase()) .join(' ')
其他
str.split(' ').map(function (s) { return s.slice(0, 1).toUpperCase() + s.slice(1).toLowerCase(); }).join(' ')
尝试这个,最短的方式:
str.replace(/(^[a-z])|(\s+[a-z])/g, txt => txt.toUpperCase());
大多数答案似乎忽略了使用单词边界元字符(\ b)的可能性.Greg Dean使用它的简短版本:
function toTitleCase(str) { return str.replace(/\b\w/g, function (txt) { return txt.toUpperCase(); }); }
适用于像Jim-Bob这样的带连字符的名字.
我认为最简单的是使用CSS.
function format_str(str) {
str = str.toLowerCase();
return ''+ str +'';
}
使用/\S+/g
支持变音符号:
function toTitleCase(str) {
return str.replace(/\S+/g, str => str.charAt(0).toUpperCase() + str.substr(1).toLowerCase());
}
console.log(toTitleCase("a city named örebro")); // A City Named Örebro
如果您可以在代码中使用第三方库,那么lodash为我们提供了一个帮助函数.
https://lodash.com/docs/4.17.3#startCase
_.startCase('foo bar');
// => 'Foo Bar'
_.startCase('--foo-bar--');
// => 'Foo Bar'
_.startCase('fooBar');
// => 'Foo Bar'
_.startCase('__FOO_BAR__');
// => 'FOO BAR'