2015-09-17 72 views
0

場景:toTitleCase JavaScript的邊緣情況

我有一個典型的toTitleCase() JavaScript函數W /正則表達式,我使用了一個單一的文本字段,一個人的名字和姓氏。

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

問題

如圖所示 - 在這種情況下,我使用這個功能的名字和姓氏。因此 - 個人姓名可能有多個大寫字母。例如:James O'Mally或Robert McNally。不幸的是,上面的JavaScript函數將返回James O'mally或Robert Mcnally。

我希望一些很棒的Stackoverflow貢獻者可以提供一個RegEx解決方案,將這個邊緣案例考慮在內,並在字符串中間保留一個現有的大寫字母值。

感謝您的時間和考慮

+0

好像你可以在最後取代「O'(\ w)」和「Mc(\ w)」... – dandavis

+0

@dandavis:感謝您的輸入 - 這當然是一個好點;然而,這些事件的列舉是不可預測的。 Mc和O只是簡單的例子。有各種各樣的名字 - 特別是有這種模式的姓氏。例如Oscar De LaHoya或William DuBouis – Sean

+0

事實上,問題太廣泛了。如果不知道它應該匹配什麼,我們就不可能編寫正則表達式。 – nhahtdh

回答

0

也許/\b[a-z]/g是你在找什麼。它將在字邊界之後大寫任何字母(a-z)。

function toTitleCase(str) { 
    return str.replace(/\b[a-z]/g, function (txt) { 
     return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); 
    }); 
} 
+0

感謝輸入的Gaby ......我實際上並沒有試圖引入大寫字母,只是在一個字的中間保留大寫字母的值。我認爲nhahtdh可能是正確的,暗示這個問題太廣泛了。 – Sean

0

@nhahtdh - 這聽起來像你可能是正確的這個問題是廣泛的回答。也許我會放棄RegEx並編寫一個將此模式考慮在內的自定義格式化程序。感謝大家的幫助