Заменить символы подчеркивания пробелами и заглавные слова

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

ех;

options_page = Options Page

На этой странице: Как сделать первый символ в верхнем регистре всех слов в JavaScript?

Я нашел это регулярное выражение:

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

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

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

Ответ 1

Это должно сделать трюк:

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

РЕПЛ

http://repl.it/OnE

Fiddle

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

JSPerf

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

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

Ответ 2

Это две разные задачи, поэтому два разных регулярных выражения - лучшее решение:

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

Чтобы гарантировать, что даже все заглавные слова обрабатываются. Вы можете добавить .toLowerCase() до самого первого .replace:

console.log('TESTING_WORD'.toLowerCase().replace(/_/g, ' ')
.replace(/(?: |\b)(\w)/g, function(key, p1) {
    return key.toUpperCase();    
}));

Ответ 3

Здесь:

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);

Ответ 4

Начиная с Lodash 3.1.0, существует _.startCase([string='']) который преобразует любой регистр в прописные слова (стартовый регистр):

_.startCase('hello_world'); // returns 'Hello World'
_.startCase('hello-world'); // returns 'Hello World'
_.startCase('hello world'); // returns 'Hello World'

В разделе String Lodash есть и другие полезные методы. Прочитайте документацию здесь.

Ответ 5

Другая альтернатива:

'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.

Ответ 6

Просто добавьте. replace('_',' ')

Как этот

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