有没有一种简单的方法将字符串转换为标题格式?例如,john smith
变成 John Smith
。我不想要像John Resig的解决方案那样复杂的东西,只是(希望)一种一两行代码就能实现的方法。
有没有一种简单的方法将字符串转换为标题格式?例如,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();
}
);
}
<form>
Input:
<br /><textarea name="input" onchange="form.output.value=toTitleCase(this.value)" onkeyup="form.output.value=toTitleCase(this.value)"></textarea>
<br />Output:
<br /><textarea name="output" readonly onclick="select(this)"></textarea>
</form>
\w+
或\w*
的情况下要使用\w\S*
呢?我不明白为什么你想包括空格以外的内容,这会使 Jim-Bob 变成 Jim-bob。 - martinczerwi\w\S*
也导致了我们这边的Jim-bob
问题。使用\w*
解决了这个问题。 - Bouke/([^\W_]+[^\s-]*) */g
可以解决 Jim-Bob
问题,即:*jim-bob
* -->
*Jim-Bob
*。 - recursion.ninjajim-bob
-->
Jim-Bob
*,你应该使用 */\b\w+/g
*。例如:str.replace(/\b\w+/g,function(s){return s.charAt(0).toUpperCase() + s.substr(1).toLowerCase();});
。 - vol7ron\w\S*
而不是\w+
或\w*
,但正如其他人指出的,\w\S*
会对连字符连接的单词造成问题。 - doubleDowntext-transform: capitalize;
请注意,这将转换以下内容:
hello world
为 Hello World
HELLO WORLD
不会改变
emily-jane o'brien
为 Emily-jane O'brien
(不正确)
Maria von Trapp
为 Maria Von Trapp
(不正确)
稍微更优雅的方式,改编自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();
这是我的版本,我认为它易于理解并且也很优雅。
const str = "foo bar baz";
const newStr = str.split(' ')
.map(w => w[0].toUpperCase() + w.substring(1).toLowerCase())
.join(' ');
console.log(newStr);
str.split(' ').map(i => i[0].toUpperCase() + i.substring(1).toLowerCase()).join(' ')
- Dave Land.toLowerCase()
方法。像“McDonald”这样的名称或缩写词“ASAP”应该保留它们的大写字母。如果有人实际上传入了类似于“heLLO”的字符串,应用程序不应假定大写字母是错误的。 - Thomas HigginbothamString.prototype.toTitleCase = function (blnForceLower) { var strReturn; (blnForceLower ? strReturn = this.toLowerCase() : strReturn = this); return strReturn .split(' ') .map(i => i[0].toUpperCase() + i.substr(1)) .join(' '); }
- Sean Kendle这是我的函数,它可以将文本转换为标题格式,同时将定义的缩略词保留为大写字母,次要单词保留为小写字母:
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:"
/\w\S*/g
更改为/([^\W_]+[^\s-]*) */g
,以解决@awashburn上面的评论所提出的问题。 - Geoffrey Booth/([^\W_]+[^\s-]*) */g
更改为/\b\w+/g
;如果您发现需要更复杂的正则表达式,请在评论中指出。 - Geoffrey Booth/\b[\w-\']+/g
,以允许单词中包含连字符和撇号。 - Shamasis BhattacharyatoLowerCase()
方法。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() });
}
Example:
String.prototype.toTitle = function() {
return this.replace(/(^|\s)\S/g, function(t) { return t.toUpperCase() });
}
console.log('all lower case ->','all lower case'.toTitle());
console.log('ALL UPPER CASE ->','ALL UPPER CASE'.toTitle());
console.log("I'm a little teapot ->","I'm a little teapot".toTitle());
const titleCase = (str) => str.replace(/\b\S/g, t => t.toUpperCase());
- 0xcafftoLowerCase
)比假设开发人员意图的答案更加灵活/有用。这种方法也反映了其他编程语言内置函数的功能,例如PHP(ucwords
)和Golang(strings.Title
)。有趣的是,.NET(TextInfo.ToTitleCase
)适用于混合大小写,但它也会保留全大写的字符串不变。 - Tom KaytoLowerCase
,这对我来说已经足够好了。+1,干杯 - Madbreaksfunction titleCase(str) {
return str.toLowerCase().replace(/\b\w/g, s => s.toUpperCase());
}
console.log(titleCase('iron man'));
console.log(titleCase('iNcrEdible hulK'));
该基准测试的赢家是普通的for循环:
function titleize(str) {
let upper = true
let newStr = ""
for (let i = 0, l = str.length; i < l; i++) {
// Note that you can also check for all kinds of spaces with
// str[i].match(/\s/)
if (str[i] == " ") {
upper = true
newStr += str[i]
continue
}
newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase()
upper = false
}
return newStr
}
// NOTE: you could beat that using charcode and string builder I guess.
我选取了最受欢迎和独特的答案,并制作了基准测试。
这是在我的 MacBook Pro 上的结果:
为了完整起见,这里列出了使用的函数:
str = "the QUICK BrOWn Fox jUMPS oVeR the LAzy doG";
function regex(str) {
return str.replace(
/\w\S*/g,
function(txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
}
);
}
function split(str) {
return str.
split(' ').
map(w => w[0].toUpperCase() + w.substr(1).toLowerCase()).
join(' ');
}
function complete(str) {
var i, j, str, lowers, uppers;
str = str.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;
}
function firstLetterOnly(str) {
return str.replace(/\b(\S)/g, function(t) { return t.toUpperCase(); });
}
function forLoop(str) {
let upper = true;
let newStr = "";
for (let i = 0, l = str.length; i < l; i++) {
if (str[i] == " ") {
upper = true;
newStr += " ";
continue;
}
newStr += upper ? str[i].toUpperCase() : str[i].toLowerCase();
upper = false;
}
return newStr;
}
str.toLowerCase().replace(/\b\S/g, function(t) { return t.toUpperCase(); });
这段代码也使用了正则表达式方法,并且实现了相同的结果。 - dovidcomplete
方法的显著改进:https://jsben.ch/yTK3Y - dovidvar result =
'this is very interesting'.replace(/\b[a-z]/g, (x) => x.toUpperCase())
console.log(result) // This Is Very Interesting
'string'.replace(/^(.)(.*)/,function(s,p1,p2){return p1.toUpperCase()+p2;})
再次说明,这只能用于将字符串的第一个字母大写,但如果这是你所需要的,那我的方法是可行的。 - Michael Blackburn'$1'.toUpperCase()
,似乎在赋值时大写字母还没有被执行。通过使用函数'string'.replace(/^(.){1}/,function(match) { return match.toUpperCase(); })
进行了解决。 - MrYellow惊讶地看到没有人提到使用rest参数。这里是一个简单的一行代码,使用了ES6 Rest参数。
let str="john smith"
str=str.split(" ").map(([firstChar,...rest])=>firstChar.toUpperCase()+rest.join("").toLowerCase()).join(" ")
console.log(str)