Javascript将"后的下一个字符大写Mc"

Javascript to capitalize the next char after " Mc"

本文关键字:quot Mc 字符 Javascript 下一个      更新时间:2023-09-26

给定一个像Marty Mcfly这样的字符串,是否有一个正则表达式或其他一行解决方案来大写'f',所以我得到Marty McFly ?

我总是可以指望第一个和最后一个之间的空格,姓氏的第一个字母(即M)总是大写的。

我对任何javascript, jquery, regex解决方案都很开放,我只需要它简短而可爱。

我有一个方法,把字符串分开使用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是整个regex匹配,参数p1是第一个括号组匹配的内容,回调返回您想要替换整个regex匹配的内容。

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

使用RegEx的exec方法和String的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()));
}

这是我能做的最好的:

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