JavaScript如何将“Mc”后面的字符转为大写?

8

如果有一个字符串,如Marty Mcfly,是否有一个正则表达式或其他一行代码的解决方案来将 'f' 大写,以便我得到 Marty McFly

我总是可以在名字和姓氏之间的空格以及姓氏的第一个字母(即 M)中找到大写字母。

对于任何 JavaScript、jQuery、正则表达式的解决方案,我都非常开放,只需要简短明了。

我有一个使用 indexOf 和 substring 拆分字符串的方法,但我希望有一个正则表达式或类似的东西。


1
需要在Mac上工作吗?O'Connor怎么样?DeVille呢?将O'Connor与D'eath进行比较。你的范围是什么? - RB.
好问题。是的,如果它在Mac上能用就更好了。我已经用另一个正则表达式覆盖了O'Conner等人。虽然我没有想到DeVille,但我不知道你怎么能把它与任何以“De”开头的名字区分开来,所以我们可以在没有它的情况下生存下去。 - kasdega
+1 非常好的、跨平台的正则表达式问题! - Gustav Barkefors
5个回答

10

你可以利用 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"

6

这是使用 .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是第一个加括号捕获组的内容,回调函数返回你希望替换整个正则表达式匹配的内容。


从来没想过可以这样使用切片。谢谢。 - kasdega

2

使用正则表达式的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()));
}

+1 给你第一个答案...如果我错了,请纠正我,但是像“Shane Mack”这样的名字会被搞砸,对吗?我们决定容忍这些小问题,我们只想解决一些主要问题。感谢您抽出时间回复。 - kasdega

2
var text = 'Marty Mcfly';
text = text.replace(/Mc[a-z]/, function (k)
    {
      return 'Mc' + k[2].toUpperCase();
    }
  );

1

这是我能做到的最好:

'Marty Mcfly'.replace(/ mc([a-z])/i, function (str, $1) {return  " Mc" + $1.toUpperCase()})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接