Javascript 首字母大写,其余字母小写,例外
我有一些数据需要格式化,将每个单词的第一个字母大写,其余字母小写。我正在使用以下工具:Javascript 首字母大写,其余字母小写,例外,javascript,regex,Javascript,Regex,我有一些数据需要格式化,将每个单词的第一个字母大写,其余字母小写。我正在使用以下工具: function toTitleCase(str){ return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); } 它可以工作,但我需要向它添加异常,所有值都在一个数组中: [美国、美国、7UP、PC、SlimFast等] 这些值有时较
function toTitleCase(str){
return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}
它可以工作,但我需要向它添加异常,所有值都在一个数组中:
[美国、美国、7UP、PC、SlimFast等]
这些值有时较高,有时较低,有时混合,不需要修改。有什么想法吗?关于以下内容:
function toTitleCase(str){
var ignore = inArray(exceptionsArr, str);
if (!ignore) {
return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}
return str;
}
inArray: function(arr, obj) {
return (arr.indexOf(obj) != -1);
},
或者,如果你的str是一个完整的句子,里面有例外词,你可以将str拆分成单独的词,然后用for循环运行上述过程中的每个词
function toTitleCase(str){
var cantTouchThis = {'USA' : 1, 'U.S.A' : 1, '7UP' : 1, 'PC' : 1, 'SLIMFAST' : 1};
return str.replace(/\w[\S.]*/g, function(txt){return cantTouchThis[txt.toUpperCase()] ? txt : txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}
键是您不想替换的字符串的大写字母
这些值可以是计算结果为true
但您可能还希望给出唯一正确的大小写值,例如:
function toTitleCase(str){
var cantTouchThis = {'USA' : 'USA', 'U.S.A' : 'USA', '7UP' : '7Up', 'PC' : 'PC', 'SLIMFAST' : 'SlimFast'};
return str.replace(/\w[\S.]*/g, function(txt){return cantTouchThis[txt.toUpperCase()] || txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}
这种方式类似于:
UsA U.S.A.FAST
将成为:
USA Anything SlimFast
编辑:我似乎不太明白例外是整个单词。下面的答案涉及作为单词一部分的例外情况。
我不确定这是否是最好的解决方案,但您可以获得一个与异常匹配的数组,然后运行函数,然后将匹配项替换回来
var exceptions = ['USA','U\.S\.A','7UP','PC','SlimFast']; //escaped strings!
var matcher = new RegExp(exceptions.join('|'), 'gi');
var str = 'tuSalolpCOKyes'; //test string
var matches = str.match(matcher); // extract replacements
var str = toTitleCase(str); // run your function
// replace stuff you didn't want changed
var index = 0;
var str = str.replace(matcher, function() {
return matches[index++];
});
console.log(str); // RESULT: TuSalolpCokyes
// your function
function toTitleCase(str){
return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
}
使用以下函数求解
function toTitleCase(str){
return str.replace(/\w\S*/g, function(txt){
if(['PC','USA','U.S.A'].includes(txt))===-1){
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
} else {
return txt;
}
});
}
name = toTitleCase(name);
这可能不完全是您所需要的,但总体思路是:
i
标志忽略大小写)使用白名单数组怎么样?如果数组中存在
txt
,则返回而不执行任何操作。@h2ooooooo:我应该编写txt
,而不是str
。现在已修复。您可以避免使用charAt
和substr
这样做:s.replace(/(\w)(\s*)/g,函数(m,a,b){返回a.toUpperCase()+b.toLowerCase();})
.FYI:indexOf
首先添加到IE9中的数组中。您用uuxofcantTouchThis.毁了您的答案。。很好+1.
var s = "UsA bar U.S.A. fOO slimfast bAz",
ignore = ["USA", "U.S.A", "7UP", "PC", "SlimFast"],
regex = new RegExp(ignore.join("|"), 'i'),
result = s.split(' ').map(function(word){
return (regex.test(word)) ? word : capitalize(word);
}).join(' ');
// "UsA Bar U.S.A. Foo slimfast Baz"
function capitalize(s) {
return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase();
}