JavaScript: регулярное выражение CamelCase для предложения

Я нашел этот пример для изменения CamelCase к Даше. Я изменил код, чтобы изменить CamelCase на Sentencecase с пробелами вместо тире. Он отлично работает, но не для букв из одного слова, таких как «i» и «a». Любые идеи, как включить это?

  • thisIsAPain --> Это боль

    var str = "thisIsAPain"; 
    str = camelCaseToSpacedSentenceCase(str);
    alert(str)
    
    function camelCaseToSpacedSentenceCase(str)
    {
        var spacedCamel = str.replace(/\W+/g, " ").replace(/([a-z\d])([A-Z])/g, "$1 $2");
        spacedCamel = spacedCamel.toLowerCase();
        spacedCamel = spacedCamel.substring(0,1).toUpperCase() + spacedCamel.substring(1,spacedCamel.length)
        return spacedCamel;
    }
    

person Ghoul Fool    schedule 05.12.2012    source источник
comment
Это ваш 12-й вопрос (в дополнение к 17 ответам), вы уже должны правильно его форматировать. Когда вы вводили свой вопрос, справа было удобное поле Как форматировать. Внизу также была область предварительного просмотра.   -  person T.J. Crowder    schedule 05.12.2012
comment
Упс! Это была моя ошибка. Я знаю о форматировании кода, но я должен не забыть добавить новую строку в начало кода, прежде чем заменять все на \n   -  person Ghoul Fool    schedule 05.12.2012


Ответы (3)


Самая последняя версия:

"thisIsNotAPain"
    .replace(/^[a-z]|[A-Z]/g, function(v, i) {
        return i === 0 ? v.toUpperCase() : " " + v.toLowerCase();
    });  // "This is not a pain"

Старое решение:

"thisIsAPain"
    .match(/^(?:[^A-Z]+)|[A-Z](?:[^A-Z]*)+/g)
    .join(" ")
    .toLowerCase()
    .replace(/^[a-z]/, function(v) {
        return v.toUpperCase();
    });  // "This is a pain"

console.log(
    "thisIsNotAPain"
        .replace(/^[a-z]|[A-Z]/g, function(v, i) {
            return i === 0 ? v.toUpperCase() : " " + v.toLowerCase();
        })  // "This is not a pain" 
);

console.log(
    "thisIsAPain"
        .match(/^(?:[^A-Z]+)|[A-Z](?:[^A-Z]*)+/g)
        .join(" ")
        .toLowerCase()
        .replace(/^[a-z]/, function(v) {
            return v.toUpperCase();
        })  // "This is a pain"
);

person VisioN    schedule 05.12.2012
comment
Такая скорость! Это красота. Однажды я надеюсь вырастить больший мозг и расшифровать все это. - person Ghoul Fool; 05.12.2012
comment
@GhoulFool Я почти уверен, что ты сможешь сделать это быстрее ;) - person VisioN; 05.12.2012
comment
Один день. Я всего лишь мастер регулярных выражений 4-го уровня. Скоро у меня будет 5 уровень, и я смогу играть со списками слов и превращать котов в летучих мышей. - person Ghoul Fool; 05.12.2012

Измените первую строку вашей функции на

var spacedCamel = str.replace(/([A-Z])/g, " $1");
person garyh    schedule 05.12.2012

Алгоритм этого следующий:

  1. Добавьте пробел ко всем символам верхнего регистра.
  2. Обрежьте все конечные и начальные пробелы.
  3. Прописная первая буква.

Javascript-код:

function camelToSpace(str) {
    //Add space on all uppercase letters
    var result = str.replace(/([A-Z])/g, ' $1').toLowerCase();
    //Trim leading and trailing spaces
    result = result.trim();
    //Uppercase first letter
    return result.charAt(0).toUpperCase() + result.slice(1);
}

Перейдите по этой ссылке.

person Kevin Garcia    schedule 05.12.2012