2014-02-15 52 views
12

我正在嘗試創建一種將小寫字母和下劃線的文本轉換爲不帶下劃線的文本並將每個單詞的首字母大寫的方法。用空格替換下劃線並大寫單詞

ex;

options_page = Options Page 

在這個頁面:How to make first character uppercase of all words in JavaScript?

我發現這個正則表達式:

key = key.replace(/(?:_| |\b)(\w)/g, function(key, p1) { return p1.toUpperCase()}); 

這並不只是用空格代替下劃線的一切。我並沒有真正嘗試過任何東西,因爲我不熟悉regexpressions。

如何調整此正則表達式,以便用空格替換下劃線?

+0

對於那些誰使用lodash,有'startCase'函數,該函數 – oluckyman

回答

17

這應該做的伎倆:

function humanize(str) { 
    var frags = str.split('_'); 
    for (i=0; i<frags.length; i++) { 
    frags[i] = frags[i].charAt(0).toUpperCase() + frags[i].slice(1); 
    } 
    return frags.join(' '); 
} 


humanize('humpdey_dumpdey'); 
// > Humpdey Dumpdey 

REPL

http://repl.it/OnE

小提琴

http://jsfiddle.net/marionebl/nf4NG/

jsPerf

大多數測試數據http://jsperf.com/string-transformations

所有版本加_.strhttp://jsperf.com/string-transformations/3

+0

這樣做的工作,但正則表達式更快,更簡潔。 –

+1

我跟你們討論代碼的大小,但根據我的[測試](http://jsperf.com/string-transformations),'str.split'在大多數瀏覽器中速度更快。 – marionebl

+0

當被解碼並定義爲「函數人性化」時,代碼大小爲[131](http://bit.ly/1hkQNOl)與[111](http://bit.ly/1g6IU9O)字節。 – marionebl

3

這是兩個不同的任務,所以兩個不同的正則表達式是最好的解決辦法:

key = key.replace(/_/g, ' ').replace(/(?: |\b)(\w)/g, function(key) { return key.toUpperCase()}); 
+0

您可以從第二個正則表達式刪除下劃線,因爲他們都被刪除。 – Barmar

+0

感謝您的回答。不幸的是,它現在產生的結果與以前一樣; contact_details = ContactDetails;它並沒有把空間放在那裏。 –

+0

對,我沒有注意到第二個正則表達式也刪除了空格。我編輯了代碼來改變這個功能。現在它按預期工作,你可以查看[這裏](http://repl.it/Omi)。 –

2

這裏:

var str = 'Lorem_ipsum_dolor_sit_amet,_consectetur____adipiscing_elit.' 
str = str.replace(/_{1,}/g,' ').replace(/(\s{1,}|\b)(\w)/g, function(m, space, letter) 
{ 
    return space + letter.toUpperCase(); 
}) 

console.log(str); 
1

另一種替代方法:

'options_page'.replace(/(^|_)(\w)/g, function ($0, $1, $2) { 
    return ($1 && ' ') + $2.toUpperCase(); 
}); 

正則表達式:

(^|_) beginning of the input OR "_" ($1) 
(\w) a word character (short for [a-zA-Z0-9_]) ($2) 
g  all occurences 

更多關於正則表達式:http://www.javascriptkit.com/javatutors/redev.shtml

0

只需添加。 replace('_',' ')

篩選

function toCamel(string){ 
    return string.replace(/(?:_| |\b)(\w)/g, function($1){return $1.toUpperCase().replace('_',' ');}); 
}