2013-06-19 90 views
3

我看了一些关于在StackOverflow中大写的问题和解答,但找不到有关我的问题的答案。Javascript首字母大写字母的每个单词的第一个字母只有当lengh> 2

我想为每个字的第一个字母字符串中只有一句话lengh> 2.

我临时的解决办法是:

var str = str.toLowerCase().replace(/\b[a-z]/g, function (letter) { 
       return letter.toUpperCase(); 
      }).replace(/\b\w{1,2}\b/g, function (letter) { 
       return letter.toLowerCase(); 
      }); 

没有可以团结两个正则表达式的解决方案在一个?

+0

在边缘的情况下应该发生什么,如“我想成为'titelised'“?引用的单词是否应该保持不变? – Xotic750

+0

或其他如“第19修正案”或“训练19”等,不幸的是语言是不规则的。 – Xotic750

+0

@ Xotic750该功能用于格式化名称。 –

回答

13

这必须做的工作:

str = str.toLowerCase().replace(/\b[a-z](?=[a-z]{2})/g, function(letter) { 
    return letter.toUpperCase(); }); 

[编辑]

上面的例子是有点幼稚,因为它假定有字符串中的字母,并没有考虑到这单词边界\b可以匹配单词字符[a-zA-Z0-9_]与非单词字符或锚点之间的限制。因此,要更加严格,这是更好地写:

str = str.toLowerCase().replace(/([^a-z]|^)([a-z])(?=[a-z]{2})/g, function(_, g1, g2) { 
    return g1 + g2.toUpperCase(); }); 

如果你想要做相同的,但这个时候,包括字符串的第一个字母(无论之后的字母数),您可以使用此:

str = str.toLowerCase().replace(/([^a-z])([a-z])(?=[a-z]{2})|^([a-z])/g, function(_, g1, g2, g3) { 
    return (typeof g1 === 'undefined') ? g3.toUpperCase() : g1 + g2.toUpperCase(); }); 
+0

这不考虑该单词的长度是否大于2. :) – aug

+1

@aug:它正确地被修正 –

+0

正是我所需要的 –

3

试试这个:

var str = str.toLowerCase().replace(/\b\w{3,}/g, function (l) { 
    return l.charAt(0).toUpperCase() + l.slice(1); 
}); 
0

也许使用的功能,使之更干净

var capitalize1st = function(str){ 
    str = str || ''; 

    // string length must be more than 2 
    if(str.length<3){ 
     return str; 
    } 

    return str[0].toUpperCase()+str.slice(1); 
} 

var splitWordsAndCap1st = function(str){ 
    str = str || ''; 

    var words = str.match(/\S+/g); 

    for(var i=0;i<words.length;i++){ 
     words[i] = capitalize1st(words[i]); 
    } 

    return words.join(' '); 
} 

splitWordsAndCap1st("I would like to capitalize first letter of each word in a string"); 
+0

这不是OP所要求的:**我只想在单词lengh> 2时将每个单词的首字母大写。** –

+0

对不起。我的错。 – AntouanK

+0

我误解了这个问题。我改变了我的答案,现在它解决了这个问题,你可以编辑你喜欢的功能。 – AntouanK

0

无需正则表达式(只是其中很小的一个捕捉空格),你可以这样做

的Javascript

function titleCaseLengthGt2(string) { 
    var array = string.split(/(\s+)/), 
     length = array.length, 
     i = 0, 
     word; 

    while (i < length) { 
     //array[i] = array[i].toLowerCase(); // make words lowercased first if you want 
     word = array[i]; 
     if (word.length > 2) { 
      array[i] = word.charAt(0).toUpperCase() + word.slice(1); 
     } 

     i += 1; 
    } 

    return array.join(""); 
} 

console.log(titleCaseLengthGt2("i want to be titelised")); 

输出

i Want to be Titelised 

jsfiddle

+0

单词边界与空白不同。而正则表达式在这里肯定有帮助:-) – Bergi

+0

事实上,尽管这是最大的一个群体,这就是为什么我质疑OP是什么意思的一个“单词”。无论如何,在这种情况下,即使语言是不规则的,也需要一些用于分割“单词”和捕获非“单词”的小型正则表达式/使其更容易。我仍然希望在可能的情况下避免使用正则表达式,并将它们用作最终的手段(可以这么说):) – Xotic750

+0

“不需要正则表达式” - 但哪种方法更高效? – iamwhitebox

0

为了利用第一每个单词在字符串中的单词长度> 2,我用英文文本:

l_text = l_text.toLowerCase().replace(/(?=\b)([a-z])(?=[a-z]{2})/g, 
    function(g0) {return (g0.toUpperCase());}); 

通常在现实生活中,规则“字长> 2”是不够的。

为了抓住城镇的名字在法国我必须排除一些词像这样的样品中:

l_text = "Bourg-en-Bresse, NEUILLY SUR SEINE, enghien-les-bains"; 
l_text = l_text.toLowerCase().replace(/(?=\b)(?!(?:d|en|les|sous|sur)\b)([a-z])/g, 
    function(g0) {return (g0.toUpperCase());}); 

对于更复杂的情况,你可以合并式断言((:|?!恩| LES | sous | sur)\ b)和正向前瞻断言(?= [az] {2})。

处理非标单词边界和字符了AZ范围,你可以使用一个单词边界和特定字符设置为背景:

/(?:^|[\s'\-])(?!(?:d|en|les|sous|sur)[\s'\-])([a-zàâéèêïôùûç])/g 
相关问题