2015-11-05 20 views
3

我能够使用它将普通字符串更改为标题大小写。更改包含'的字符串,TitleCase

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

检查[此演示](http://jsfiddle.net/2w8kejdq/)。 'console.log('maurEEN o \'hARA'.replace(/ \ b(\ w)(\ w *)/ g,function(m,grp1,grp2){grub1.toUpperCase()+ grp2.toLowerCase (); }));' –

+0

谢谢,这工作如果姓氏有macnamee或mc? – AndroidAL

+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等等,(ma?c)?,然后在组2中匹配并捕获一个字母数字符号((\w)),然后匹配并捕获属于当前字词的0个或更多最终字母数字字符(与(\w*))。

在回调函数中,我们检查组1是否被设置,如果是,我们首先使用mcmac,然后是其余的。如果组1未设置,则我们不处理该部分,并且仅将组2的大写。

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

它应该是“容易”延伸。