Преобразование camelCaseText в текст регистра предложения

154

Как я могу преобразовать строку типа «helloThere» или «HelloThere» в «Hello There» в JavaScript?

HyderA
источник
9
хм .. каков ваш ожидаемый результат для iLiveInTheUSA?
wim
8
Я живу в U ... о, черт! - Но в моем случае у меня ограниченный набор строк, и нет таких строк, которые могли бы сломать простой конвертер. Хороший улов!
HyderA
Точно так же uSBPort должен приводить к «USB-порту»
signonsridhar
2
@wim: iLiveInTheUSA должен быть iLiveInTheUsa в правильной нотации верблюжьего регистра, но это вызовет другие проблемы.
Конрад Хёффнер

Ответы:

197
var text = 'helloThereMister';
var result = text.replace( /([A-Z])/g, " $1" );
var finalResult = result.charAt(0).toUpperCase() + result.slice(1);
console.log(finalResult);

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

Обратите внимание на пространство в " $1".

РЕДАКТИРОВАТЬ: добавлен пример использования заглавной буквы в первой букве. Конечно, если первая буква уже заглавная - вам нужно будет удалить свободное место.

ZenMaster
источник
1
Я копаю использование пробелов text.replace, я также
дополнял
8
uSBPorts => USB-порты, а не то, что я ожидал, мне нужны USB-порты
signonsridhar
как насчет того, чтобы написать лайк Non-GoogleChrome?
тим
@signonsridhar Человек, если бы кто-то написал строчные буквы usb portsкак uSBPorts, я украл бы клавиши Shift из их клавиатуры. Я надеюсь, что так и будет usbPorts. В таких случаях, как theUSA, у вас может быть опция, например consecutiveCapsMode, с разными режимами: lowerи split, например. Тогда все camelToSentence('theUSA', { consecutiveCapsMode: 'lower' })должно вернуться theUsaи т. Д.
Ник Булл,
В дополнение к вышесказанному это будет примерно так:camelToKebab = (str, mode) { let rgx = /defaultRgx/; switch(mode) { 'lower': rgx = /lowerRgx/; break; } ... }
Ник Булл,
113

В качестве альтернативы используя lodash :

lodash.startCase(str);

Пример:

_.startCase('helloThere');
// ➜ 'Hello There'

Lodash - прекрасная библиотека для быстрого доступа ко многим повседневным задачам js. Есть много других подобных функций манипулирования строками, таких как camelCaseи kebabCaseт. Д.

Wtower
источник
Если вы попробуете, hello worldто вывод должен быть Hello There: В этом случае loadash не поможет.
Абхишек Кумар
@AbhishekKumar startCase of lodash фактически преобразуется hello worldв Hello World lodash.com/docs/4.17.15#upperFirst
user1696017
Ты прав, братан. По ошибке я написал hello thereв hello world.
Абхишек Кумар
3
Каждый раз, когда я думаю, что «lodash тоже не может этого сделать», это так.
efru
Будьте осторожны,
начиная с версии
54

У меня была аналогичная проблема, и я решил ее так:

stringValue.replace(/([A-Z]+)*([A-Z][a-z])/g, "$1 $2")

Для более надежного решения:

stringValue.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1")

http://jsfiddle.net/PeYYQ/

Вход:

 helloThere 
 HelloThere 
 ILoveTheUSA
 iLoveTheUSA

Выход:

 hello There 
 Hello There 
 I Love The USA
 i Love The USA
Джеймс Хури
источник
это дает дополнительное пространство в начале
hannad rehman
5
Это не приговор, как просил OP. Первая буква должна быть заглавной.
H Dog
Кроме того, добавлен дополнительный пробел между словами
Alacritas
35

Пример без побочных эффектов.

function camel2title(camelCase) {
  // no side-effects
  return camelCase
    // inject space before the upper case letters
    .replace(/([A-Z])/g, function(match) {
       return " " + match;
    })
    // replace first char with upper case
    .replace(/^./, function(match) {
      return match.toUpperCase();
    });
}

В ES6

const camel2title = (camelCase) => camelCase
  .replace(/([A-Z])/g, (match) => ` ${match}`)
  .replace(/^./, (match) => match.toUpperCase());
реневандерарк
источник
1
Сплошной, +1 за фрагмент es6.
BradStell
5
К вашему сведению, это добавляет лишний пробел в начало предложения.
Dale Zak
23

Лучшая строка, которую я нашел для тестирования функций от верблюжьего регистра к заголовку, - это смехотворно бессмысленный пример, который проверяет множество крайних случаев. Насколько мне известно, ни одна из ранее опубликованных функций не справляется с этим правильно :

__ToGetYourGEDInTimeASongOThe26ABCsIsOfTheEssenceButAPpersonalIDCardForUser_456InRoom26ACсодержащийABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D

Это должно быть преобразовано в:

Получить GED вовремя Песня о 26 азбуках важна, но личная идентификационная карта для пользователя 456 в комнате 26A, содержащая ABC 26 раз, не так просто, как 123 для C3PO, R2D2 или 2R2D

Если вам нужна простая функция, которая обрабатывает случаи, подобные приведенному выше (и больше случаев, чем многие из предыдущих ответов), вот тот, который я написал. Этот код не особенно элегантен или быстр, но он прост, понятен и работает.

Приведенный ниже фрагмент содержит пример выполнения в Интернете:

var mystrings = [ "__ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser_456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D", "helloThere", "HelloThere", "ILoveTheUSA", "iLoveTheUSA", "DBHostCountry", "SetSlot123ToInput456", "ILoveTheUSANetworkInTheUSA", "Limit_IOC_Duration", "_This_is_a_Test_of_Network123_in_12__days_",  "ASongAboutTheABCsIsFunToSing", "CFDs", "DBSettings", "IWouldLove1Apple", "Employee22IsCool", "SubIDIn",  "ConfigureABCsImmediately", "UseMainNameOnBehalfOfSubNameInOrders" ];

// Take a single camel case string and convert it to a string of separate words (with spaces) at the camel-case boundaries.
// 
// E.g.:
//    __ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser_456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D
//                                            --> To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D
//    helloThere                              --> Hello There
//    HelloThere                              --> Hello There 
//    ILoveTheUSA                             --> I Love The USA
//    iLoveTheUSA                             --> I Love The USA
//    DBHostCountry                           --> DB Host Country
//    SetSlot123ToInput456                    --> Set Slot 123 To Input 456
//    ILoveTheUSANetworkInTheUSA              --> I Love The USA Network In The USA
//    Limit_IOC_Duration                      --> Limit IOC Duration
//    This_is_a_Test_of_Network123_in_12_days --> This Is A Test Of Network 123 In 12 Days
//    ASongAboutTheABCsIsFunToSing            --> A Song About The ABCs Is Fun To Sing
//    CFDs                                    --> CFDs
//    DBSettings                              --> DB Settings
//    IWouldLove1Apple                        --> I Would Love 1 Apple
//    Employee22IsCool                        --> Employee 22 Is Cool
//    SubIDIn                                 --> Sub ID In
//    ConfigureCFDsImmediately                --> Configure CFDs Immediately
//    UseTakerLoginForOnBehalfOfSubIDInOrders --> Use Taker Login For On Behalf Of Sub ID In Orders
//
function camelCaseToTitleCase(in_camelCaseString) {
        var result = in_camelCaseString                         // "__ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser_456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D"
            .replace(/(_)+/g, ' ')                              // " ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser 456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D"
            .replace(/([a-z])([A-Z][a-z])/g, "$1 $2")           // " To Get YourGEDIn TimeASong About The26ABCs IsOf The Essence ButAPersonalIDCard For User456In Room26AContainingABC26Times IsNot AsEasy As123ForC3POOrR2D2Or2R2D"
            .replace(/([A-Z][a-z])([A-Z])/g, "$1 $2")           // " To Get YourGEDIn TimeASong About The26ABCs Is Of The Essence ButAPersonalIDCard For User456In Room26AContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
            .replace(/([a-z])([A-Z]+[a-z])/g, "$1 $2")          // " To Get Your GEDIn Time ASong About The26ABCs Is Of The Essence But APersonal IDCard For User456In Room26AContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
            .replace(/([A-Z]+)([A-Z][a-z][a-z])/g, "$1 $2")     // " To Get Your GEDIn Time A Song About The26ABCs Is Of The Essence But A Personal ID Card For User456In Room26A ContainingABC26Times Is Not As Easy As123ForC3POOr R2D2Or2R2D"
            .replace(/([a-z]+)([A-Z0-9]+)/g, "$1 $2")           // " To Get Your GEDIn Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC26Times Is Not As Easy As 123For C3POOr R2D2Or 2R2D"
            
            // Note: the next regex includes a special case to exclude plurals of acronyms, e.g. "ABCs"
            .replace(/([A-Z]+)([A-Z][a-rt-z][a-z]*)/g, "$1 $2") // " To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC26Times Is Not As Easy As 123For C3PO Or R2D2Or 2R2D"
            .replace(/([0-9])([A-Z][a-z]+)/g, "$1 $2")          // " To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456In Room 26A Containing ABC 26Times Is Not As Easy As 123For C3PO Or R2D2Or 2R2D"  

                        // Note: the next two regexes use {2,} instead of + to add space on phrases like Room26A and 26ABCs but not on phrases like R2D2 and C3PO"
            .replace(/([A-Z]{2,})([0-9]{2,})/g, "$1 $2")        // " To Get Your GED In Time A Song About The 26ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
            .replace(/([0-9]{2,})([A-Z]{2,})/g, "$1 $2")        // " To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
            .trim()                                             // "To Get Your GED In Time A Song About The 26 ABCs Is Of The Essence But A Personal ID Card For User 456 In Room 26A Containing ABC 26 Times Is Not As Easy As 123 For C3PO Or R2D2 Or 2R2D"
           ;

  // capitalize the first letter
  return result.charAt(0).toUpperCase() + result.slice(1);
}

for (var i = 0; i < mystrings.length; i++) {
  jQuery(document.body).append("<br />\"");
  jQuery(document.body).append(camelCaseToTitleCase(mystrings[i]));
  jQuery(document.body).append("\"<br>(was: \"");
  jQuery(document.body).append(mystrings[i]);
  jQuery(document.body).append("\") <br />");
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>

Крис Клайн
источник
1
Контрольные примеры с интервалом в нижнюю часть больше не работают, только предупреждение. Добавление: .replace(/_/g,' ')решает эту проблему. Кроме того, добавление .replace(\&\, ' & ')поддерживает разделение амперсанда
Джастин Далримпл,
1
Спасибо, что указали на это @JustinDalrymple. Наш внутренний код оборачивает указанную camelCaseToTitleCase()выше функцию в помощник, который обрабатывает символы подчеркивания, поэтому я не заметил упущения, когда опубликовал его. Я исправлю код выше.
Крис Клайн,
12

Основываясь на одном из приведенных выше примеров, я пришел к следующему:

const camelToTitle = (camelCase) => camelCase
  .replace(/([A-Z])/g, (match) => ` ${match}`)
  .replace(/^./, (match) => match.toUpperCase())
  .trim()

Это работает для меня, потому что он используется .trim()для обработки крайнего случая, когда первая буква пишется с заглавной буквы, а вы получаете дополнительный ведущий пробел.

Ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim

Энтони С.
источник
10

Хорошо, я на несколько лет опоздал с игрой, но у меня был аналогичный вопрос, и я хотел сделать решение с одной заменой для каждого возможного ввода. Я должен отдать должное @ZenMaster в этой ветке и @Benjamin Udink ten Cate в этой ветке. Вот код:

var camelEdges = /([A-Z](?=[A-Z][a-z])|[^A-Z](?=[A-Z])|[a-zA-Z](?=[^a-zA-Z]))/g;
var textArray = ["lowercase",
                 "Class",
                 "MyClass",
                 "HTML",
                 "PDFLoader",
                 "AString",
                 "SimpleXMLParser",
                 "GL11Version",
                 "99Bottles",
                 "May5",
                 "BFG9000"];
var text;
var resultArray = [];
for (var i = 0; i < textArray.length; i++){
    text = textArray[i];
    text = text.replace(camelEdges,'$1 ');
    text = text.charAt(0).toUpperCase() + text.slice(1);
    resultArray.push(text);
}

В нем есть три предложения, все из которых используют опережающий просмотр, чтобы механизм регулярных выражений не использовал слишком много символов:

  1. [A-Z](?=[A-Z][a-z])ищет заглавную букву, за которой следует заглавная, а затем строчная. Это конец аббревиатуры типа USA.
  2. [^A-Z](?=[A-Z])ищет заглавные буквы, за которыми следует заглавная буква. На этом заканчиваются такие слова, как myWord, и символы, такие как 99Bottles.
  3. [a-zA-Z](?=[^a-zA-Z])ищет букву, за которой следует не буква. На этом слова заканчиваются перед такими символами, как BFG9000.

Этот вопрос был первым в моих результатах поиска, так что, надеюсь, я смогу сэкономить время другим!

Крис
источник
9

Вот моя версия. Он добавляет пробел перед каждой английской буквой UpperCase, которая идет после строчной английской буквы, а также при необходимости делает первую букву заглавной:

Например:
thisIsCamelCase -> This Is Camel Case
this IsCamelCase -> This Is Camel Case
thisIsCamelCase123 -> This Is Camel Case123

  function camelCaseToTitleCase(camelCase){
    if (camelCase == null || camelCase == "") {
      return camelCase;
    }

    camelCase = camelCase.trim();
    var newText = "";
    for (var i = 0; i < camelCase.length; i++) {
      if (/[A-Z]/.test(camelCase[i])
          && i != 0
          && /[a-z]/.test(camelCase[i-1])) {
        newText += " ";
      }
      if (i == 0 && /[a-z]/.test(camelCase[i]))
      {
        newText += camelCase[i].toUpperCase();
      } else {
        newText += camelCase[i];
      }
    }

    return newText;
  }
asafd
источник
7

Эта реализация принимает во внимание следующие друг за другом буквы и цифры в верхнем регистре.

function camelToTitleCase(str) {
  return str
    .replace(/[0-9]{2,}/g, match => ` ${match} `)
    .replace(/[^A-Z0-9][A-Z]/g, match => `${match[0]} ${match[1]}`)
    .replace(/[A-Z][A-Z][^A-Z0-9]/g, match => `${match[0]} ${match[1]}${match[2]}`)
    .replace(/[ ]{2,}/g, match => ' ')
    .replace(/\s./g, match => match.toUpperCase())
    .replace(/^./, match => match.toUpperCase())
    .trim();
}

// ----------------------------------------------------- //

var testSet = [
    'camelCase',
    'camelTOPCase',
    'aP2PConnection',
    'superSimpleExample',
    'aGoodIPAddress',
    'goodNumber90text',
    'bad132Number90text',
];

testSet.forEach(function(item) {
    console.log(item, '->', camelToTitleCase(item));
});

Ожидаемый результат:

camelCase -> Camel Case
camelTOPCase -> Camel TOP Case
aP2PConnection -> A P2P Connection
superSimpleExample -> Super Simple Example
aGoodIPAddress -> A Good IP Address
goodNumber90text -> Good Number 90 Text
bad132Number90text -> Bad 132 Number 90 Text
Дипу
источник
Я бы использовал ответ Криса Клайна, который подходит для таких строк, как «IP-адрес» (где эта функция превращает его в «IP-адрес»
Джон Хэмм
1
@JohnHamm Вы введете «IP-адрес», верно? Это не случай с верблюдами! О том, что это за регистр «верблюд», читайте здесь: en.wikipedia.org/wiki/Camel_case Не ставьте пробел между и вводите только «IPAddress». Эта функция работает нормально.
Дипу
3

Вы можете использовать такую ​​функцию:

function fixStr(str) {
    var out = str.replace(/^\s*/, "");  // strip leading spaces
    out = out.replace(/^[a-z]|[^\s][A-Z]/g, function(str, offset) {
        if (offset == 0) {
            return(str.toUpperCase());
        } else {
            return(str.substr(0,1) + " " + str.substr(1).toUpperCase());
        }
    });
    return(out);
}

"hello World" ==> "Hello World"
"HelloWorld" ==> "Hello World"
"FunInTheSun" ==? "Fun In The Sun"

Код с кучей тестовых строк здесь: http://jsfiddle.net/jfriend00/FWLuV/ .

Альтернативная версия, которая сохраняет здесь ведущие пробелы: http://jsfiddle.net/jfriend00/Uy2ac/ .

jfriend00
источник
Я знаю, что это не было требованием в вопросе, но ваше решение, например, не работает " helloWorld".
ZenMaster
Ага, это новое требование. Я попытался сделать именно то, о чем вы изначально просили. В любом случае, кратчайший путь легко выделить ведущие пробелы, если они вам там все равно не нужны. Если вы хотите, чтобы они оставались на месте, это тоже можно было бы сделать.
jfriend00
Вот jsFiddle, который показывает метод, который работает с новым требованием "helloWorld" и сохраняет начальное пространство (если вы этого хотите): jsfiddle.net/jfriend00/Uy2ac .
jfriend00
Ницца. Хотя мне интересно, как это работает. Функция-обработчик будет вызываться при каждом совпадении, не так ли?
ZenMaster
Если вы выполняете миллионы из них в настройках, чувствительных к производительности, потребуется некоторое тестирование jsperf в нескольких браузерах, чтобы увидеть, какое решение будет самым быстрым. Обратный звонок - не проблема. Регулярные выражения любого вида редко являются самым быстрым решением по сравнению с кодом специального назначения, но они позволяют сэкономить много кода (а часто и некоторые ошибки), поэтому часто являются желательным выбором. Это зависит от ваших требований.
jfriend00
3

попробуйте эту библиотеку

http://sugarjs.com/api/String/titleize

'man from the boondocks'.titleize()>"Man from the Boondocks"
'x-men: the last stand'.titleize()>"X Men: The Last Stand"
'TheManWithoutAPast'.titleize()>"The Man Without a Past"
'raiders_of_the_lost_ark'.titleize()>"Raiders of the Lost Ark"
Барно
источник
3

Если вы имеете дело с Capital Camel Case, этот фрагмент может вам помочь, а также содержит некоторые спецификации, чтобы вы могли быть уверены, что он соответствует вашему случаю.

export const fromCamelCaseToSentence = (word) =>
  word
    .replace(/([A-Z][a-z]+)/g, ' $1')
    .replace(/([A-Z]{2,})/g, ' $1')
    .replace(/\s{2,}/g, ' ')
    .trim();

И характеристики:

describe('fromCamelCaseToSentence', () => {
 test('does not fall with a single word', () => {
   expect(fromCamelCaseToSentence('Approved')).toContain('Approved')
   expect(fromCamelCaseToSentence('MDA')).toContain('MDA')
 })

 test('does not fall with an empty string', () => {
   expect(fromCamelCaseToSentence('')).toContain('')
 })

 test('returns the separated by space words', () => {
   expect(fromCamelCaseToSentence('NotApprovedStatus')).toContain('Not Approved Status')
   expect(fromCamelCaseToSentence('GDBState')).toContain('GDB State')
   expect(fromCamelCaseToSentence('StatusDGG')).toContain('Status DGG')
 })
})
Пуркхало Алекс
источник
2

Ни один из приведенных выше ответов не сработал для меня, поэтому пришлось приехать с собственным велосипедом:

function camelCaseToTitle(camelCase) {
    if (!camelCase) {
        return '';
    }

    var pascalCase = camelCase.charAt(0).toUpperCase() + camelCase.substr(1);
    return pascalCase
        .replace(/([a-z])([A-Z])/g, '$1 $2')
        .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')
        .replace(/([a-z])([0-9])/gi, '$1 $2')
        .replace(/([0-9])([a-z])/gi, '$1 $2');
}

Тестовые случаи:

null => ''
'' => ''
'simpleString' => 'Simple String'
'stringWithABBREVIATIONInside => 'String With ABBREVIATION Inside'
'stringWithNumber123' => 'String With Number 123'
'complexExampleWith123ABBR890Etc' => 'Complex Example With 123 ABBR 890 Etc'
Виталий Улантиков
источник
2

Это работает для меня, проверьте это

CamelcaseToWord ("Мое имя"); // возвращает мое имя

    function CamelcaseToWord(string){
      return string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1");
    }
Пурна Рао
источник
1
Добро пожаловать в SO :) Добавьте хотя бы одну пояснительную строку в свой код. Также убедитесь, что это ваша интеллектуальная работа, или укажите источник (и).
Lorenz Lo Sauer
Вы должны удалить пробел в латинском "$ 1". string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, "$1");
Валерия Шпинер
2

Думаю, это можно сделать просто с помощью reg exp /([a-z]|[A-Z]+)([A-Z])/g и замены "$1 $2".

ILoveTheUSADope -> Я люблю наркотики США

Мигель Энрике Леон Фигерас
источник
Не совсем, для строки QWERTYон возвращается QWERT Y.
Итачи
2

Еще одно решение на основе RegEx.

respace(str) {
  const regex = /([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])/g;
  return str.replace(regex, '$& ');
}

Объяснение

Приведенное выше RegEx состоит из двух похожих частей, разделенных оператором OR . Первая половина:

  1. ([A-Z]) - соответствует заглавным буквам ...
  2. (?=[A-Z][a-z]) - за которым следует последовательность прописных и строчных букв.

Применительно к последовательности FOo это фактически соответствует ее букве F.

Или второй сценарий:

  1. ([a-z]) - соответствует строчным буквам ...
  2. (?=[A-Z]) - за которым следует заглавная буква.

Применительно к последовательности barFoo это фактически соответствует ее букве r .

Когда все кандидаты на замену найдены, последнее, что нужно сделать, это заменить их той же буквой, но с дополнительным пробелом. Для этого мы можем использовать '$& 'в качестве замены, и она будет разрешена в совпадающую подстроку, за которой следует пробел.

пример

const regex = /([A-Z])(?=[A-Z][a-z])|([a-z])(?=[A-Z])/g
const testWords = ['ACoolExample', 'fooBar', 'INAndOUT', 'QWERTY', 'fooBBar']

testWords.map(w => w.replace(regex, '$& '))
->(5) ["A Cool Example", "foo Bar", "IN And OUT", "QWERTY", "foo B Bar"]
Итачи
источник
1
Это фантастика. Если вы добавляете {2,}непосредственно перед концом второй группы, она также может обрабатываться baseURLs(т. Е. Сохраняет «s» прикрепленным к «URL»).
диаходелический
@diachedelic Да, вы правы, просто протестировали, и это может быть действительно полезно.
Итачи
ах, но это не удается с «canAPIDoTask» - вы получаете «can APIDo Task». Эти двухбуквенные слова - проблема.
диаходелический
1

Я не пробовал найти все ответы, но несколько решений, над которыми я работал, не соответствовали всем моим требованиям.

Я смог придумать кое-что, что ...

export const jsObjToCSSString = (o={}) =>
    Object.keys(o)
          .map(key => ({ key, value: o[key] }))
          .map(({key, value}) =>
              ({
                key: key.replace( /([A-Z])/g, "-$1").toLowerCase(),
                value
              })
          )
          .reduce(
              (css, {key, value}) => 
                  `${css} ${key}: ${value}; `.trim(), 
              '')
Таббиофджуда
источник
1

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

Ввод

myCamelCaseSTRINGToSPLITDemo

Выход

my Camel Case STRING To SPLIT Demo


Это регулярное выражение для преобразования верблюжьего регистра в текст предложения

(?=[A-Z][a-z])|([A-Z]+)([A-Z][a-rt-z][a-z]\*)

с участием $1 $2 заменой.

Нажмите, чтобы просмотреть преобразование в регулярном выражении

Рахул
источник
Предоставьте соответствующий контент по вашей ссылке в теле ответа.
Грант Миллер
1

Введите javaScript

Выходной сценарий Java

   var text = 'javaScript';
    text.replace(/([a-z])([A-Z][a-z])/g, "$1 $2").charAt(0).toUpperCase()+text.slice(1).replace(/([a-z])([A-Z][a-z])/g, "$1 $2");
Манас
источник
-1

Добавление еще одного решения ES6, которое мне понравилось больше после того, как я не был доволен несколькими мыслями выше.

https://codepen.io/902Labs/pen/mxdxRv?editors=0010#0

const camelize = (str) => str
    .split(' ')
    .map(([first, ...theRest]) => (
        `${first.toUpperCase()}${theRest.join('').toLowerCase()}`)
    )
    .join(' ');
user169251
источник