2013-06-19 147 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 
相關問題