如果有一个字符串,如Marty Mcfly
,是否有一个正则表达式或其他一行代码的解决方案来将 'f' 大写,以便我得到 Marty McFly
?
我总是可以在名字和姓氏之间的空格以及姓氏的第一个字母(即 M)中找到大写字母。
对于任何 JavaScript、jQuery、正则表达式的解决方案,我都非常开放,只需要简短明了。
我有一个使用 indexOf 和 substring 拆分字符串的方法,但我希望有一个正则表达式或类似的东西。
如果有一个字符串,如Marty Mcfly
,是否有一个正则表达式或其他一行代码的解决方案来将 'f' 大写,以便我得到 Marty McFly
?
我总是可以在名字和姓氏之间的空格以及姓氏的第一个字母(即 M)中找到大写字母。
对于任何 JavaScript、jQuery、正则表达式的解决方案,我都非常开放,只需要简短明了。
我有一个使用 indexOf 和 substring 拆分字符串的方法,但我希望有一个正则表达式或类似的东西。
你可以利用 String.replace
的一种形式,它将函数作为其第二个参数:
function fixMarty(s) {
return (""+s).replace(/Mc(.)/g, function(m, m1) {
return 'Mc' + m1.toUpperCase();
});
}
fixMarty('Marty Mcfly'); // => "Marty McFly"
fixMarty("Mcdonald's"); // => "McDonald's"
这是使用 .replace()
回调的完美案例。
function fixMc(str) {
return(str.replace(/\bMc(\w)/, function(match, p1) {
return(match.slice(0, -1) + p1.toUpperCase());
}));
}
这里有一个jsFiddle http://jsfiddle.net/jfriend00/Qbf8R/,您可以在几个不同的测试用例中看到它的效果。
回调函数的解释:参数match
是整个正则表达式匹配的内容,参数p1
是第一个加括号捕获组的内容,回调函数返回你希望替换整个正则表达式匹配的内容。
使用正则表达式的exec
方法和字符串的replace
方法相结合:
var name = 'Marty Mcfly',
pattern = /\bmc([a-z])/gi,
match = pattern.exec(name);
if (match) {
alert(name.replace(pattern, 'Mc' + match[1].toUpperCase()));
}
以下是适用于“Mac”的版本:
var name = 'Connor Macleod',
pattern = /\b(mc|mac)([a-z])/gi,
match = pattern.exec(name);
if (match) {
alert(name.replace(pattern, match[1] + match[2].toUpperCase()));
}
var text = 'Marty Mcfly';
text = text.replace(/Mc[a-z]/, function (k)
{
return 'Mc' + k[2].toUpperCase();
}
);
这是我能做到的最好:
'Marty Mcfly'.replace(/ mc([a-z])/i, function (str, $1) {return " Mc" + $1.toUpperCase()})