将包含'的字符串更改为TitleCase

时间:2015-11-05 10:21:32

标签: javascript regex

我可以使用此功能将普通字符串更改为标题大小写。

return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});

我不确定如何将这样的字符串设为标题大小写,

maureen o'hara -> Maureen O'Hara
maureen macnamee -> Maureen MacNamee
Maureen mctavis ->Maureen McTavis

这可能吗?

2 个答案:

答案 0 :(得分:2)

您可以使用此代码:

function nameToTC(input) {
  return input.replace(/\b(ma?c)?(\w)(\w*)/ig, function (m, grp1, grp2, grp3) {
    if (grp1) {
        return grp1.charAt(0).toUpperCase() + grp1.substr(1).toLowerCase() + grp2.toUpperCase() + grp3.toLowerCase();
    }
    else {
        return grp2.toUpperCase() + grp3.toLowerCase();
    }
  });
}
console.log(nameToTC('maureen o\'hara'));
console.log(nameToTC('maureen macnamee'));
console.log(nameToTC('Maureen mctavis'));

结果:

Maureen O'Hara
Maureen MacNamee
Maureen McTavis

正则表达式 - \b(ma?c)?(\w)(\w*) - 首先将字边界与\b匹配,然后可选地匹配并捕获到第1组macMc等等{{1}然后匹配并捕获到第2组中的一个字母数字符号((ma?c)?),然后匹配并捕获到属于当前单词的{0}或更多个最终字母数字字符((\w))。

在回调函数中,我们检查是否设置了第1组,如果是,我们将(\w*)mc大写,然后是其余部分。如果未设置第1组,我们不处理该部分,仅将第2组资本化。

答案 1 :(得分:1)

正则表达式很有趣,但是如果你想尝试一种更具人性化的方法,试试这个:

    function toTitleCase(str)
    {
        return str.replace(/\w+/g, function(txt){
            if (txt.substr(0,2) === "mc") return "Mc" + txt.charAt(2).toUpperCase() + txt.substr(3).toLowerCase();
            else if (txt.substr(0,3) === "mac") return "Mac" + txt.charAt(3).toUpperCase() + txt.substr(4).toLowerCase();
            return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
        });
    }

它应该有效并且“更容易”扩展。