2014-02-15 3 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()}); 

Это делает все, за исключением замены подчеркивания пробелами. Я на самом деле ничего не пробовал, потому что я не знаком с регулярными выражениями.

Как настроить это регулярное выражение так, чтобы он заменял символы подчеркивания пробелами?

+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

Fiddle:

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

JSPerf:

Большинство данных испытаний: http://jsperf.com/string-transformations

Все версии плюс _.str: http://jsperf.com/string-transformations/3

+0

Это работает, но регулярные выражения являются более быстрыми и более сжатыми. –

+1

Я с вами по размеру кода, но согласно моим [тестам] (http://jsperf.com/string-transformations) 'str.split' быстрее работает в большинстве браузеров. – marionebl

+0

Размер кода [131] (http://bit.ly/1hkQNOl) vs [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('_',' ');}); 
} 
Смежные вопросы