将包含“,”的字符串转换为标题大小写

3

我可以使用以下方法将普通字符串转换为标题大小写。

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

这个可行吗?

1
请查看此演示console.log('maurEEN o\'hARA'.replace(/\b(\w)(\w*)/g, function (m, grp1, grp2) { return grp1.toUpperCase() + grp2.toLowerCase(); })); - Wiktor Stribiżew
谢谢,那个有效。如果姓氏是MacNamee或Mc会怎么样? - AndroidAL
这是一个要求吗?请将示例输入添加到问题中,并提供预期输出。 - Wiktor Stribiżew
2个回答

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匹配一个单词边界,然后使用(ma?c)?可选地匹配并捕获macMc等到第一组中。 接着,使用(\w)匹配并捕获当前单词的一个字母数字符号到第二组中,最后使用(\w*)匹配并捕获属于当前单词的零个或多个字母数字字符到第三组中。
在回调函数中,我们检查是否设置了第一组。如果设置了,我们将大写化mcmac以及其余部分。 如果未设置第一组,则不处理该部分,并且仅大写化第二组。

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();
        });
    }

它应该能够正常工作,而且扩展起来“更容易”。


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