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

Я искал решение но пока не нашел.

у меня есть следующие строки.

1. hello
2. HELLO
3. hello_world
4. HELLO_WORLD
5. Hello World

Я хочу преобразовать их в следующие:

1. Hello
2. Hello
3. HelloWorld
4. HelloWorld
5. HelloWorld

Если в строке нет пробела и подчеркивания, сначала верхний регистр, а все остальные-Нижний. Если слова разделены подчеркиванием или пробелом, то в верхнем регистре первой буквы каждого слова и удалить пробел и подчеркивание. Как я могу сделать это в JavaScript.

спасибо

5 ответов


вы могли бы сделать что-то вроде этого:

function toPascalCase(str) {
    var arr = str.split(/\s|_/);
    for(var i=0,l=arr.length; i<l; i++) {
        arr[i] = arr[i].substr(0,1).toUpperCase() + 
                 (arr[i].length > 1 ? arr[i].substr(1).toLowerCase() : "");
    }
    return arr.join("");
}

вы можете проверить это здесь этот подход довольно прост, .split() строка в массив при нахождении пробела или подчеркивания. Затем петля через массив, верхний корпус первой буквы, нижний корпус остальных...тогда возьмите этот массив заглавных слов и .join() он снова вместе в одну строку.


вот решение regex:

первая строчная строка:

 str = str.toLowerCase();

заменить все _ и пробелы и первые буквы в слове с заглавной буквы:

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

демо

обновление: меньше шагов ;)

пояснение:

/            // start of regex
 (?:         // starts a non capturing group
   _| |\b    // match underscore, space, or any other word boundary character 
             // (which in the end is only the beginning of the string ^)
  )          // end of group
 (           // start capturing group
  \w         // match word character
 )           // end of group
/g           // and of regex and search the whole string

значение группы захвата доступно как p1 в функции и весь выражение заменяется возвращаемым значением функции.


function foo(str) {
    return $(str.split(/\s|_/)).map(function() {
        return this.charAt(0).toUpperCase() + this.slice(1).toLowerCase();
    }).get().join("");
}

рабочая демо: http://jsfiddle.net/KSJe3/3/ (Я использовал регулярное выражение Nicks в демо)


Edit: другая версия кода-Я заменил map () на $.map():

function foo(str) {
    return $.map(str.split(/\s|_/), function(word) {
        return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
    }).join("");
}

рабочая демо: http://jsfiddle.net/KSJe3/4/


ES6 / функциональное обновление @NickCraver это. Как и в случае с ответом @NickCraver, эта функция будет обрабатывать несколько пробелов / подчеркиваний правильно, фильтруя их.

const pascalWord = x => x[0].toUpperCase() + x.slice(1).toLowerCase();

const toPascalCase2 = (str) => (
  str.split(/\s|_/)
    .filter(x => x)
    .map(pascalWord)
    .join('')
);

const tests = [
'hello',
'HELLO',
'hello_world',
'HELLO_WORLD',
'Hello World',
'HELLO__WORLD__',
'Hello   World_',
].map(toPascalCase2).join('<br>');

document.write(tests);

var city = город.заменить(/\S+с/г,' ') //заменить все spaceses в singele неплохим подбором кадров город = город.заменить (/\b\w / g,city => город .toUpperCase ()) //после speace письмо конвертировать капитал