Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

var text = 'helloThereMister';
var result = text.replace( /([A-Z])/g, " $1" );
var finalResult = result.charAt(0).toUpperCase() + result.slice(1); // capitalize the first letter - as an example.

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

EDIT: добавлен пример капитализации первой буквы. Конечно, в случае, если первая буква уже является капиталом - у вас будет свободное место для удаления.

Ответ 2

Альтернативно, используя lodash:

lodash.startCase(str);

Пример:

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

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

Ответ 3

У меня была аналогичная проблема, и я имел дело с этим следующим образом:

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/

Input:

 helloThere 
 HelloThere 
 ILoveTheUSA
 iLoveTheUSA

Вывод:

 hello There 
 Hello There 
 I Love The USA
 i Love The USA

Ответ 4

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

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

Ответ 5

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

ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D

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

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

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

Работающий в режиме онлайн пример этого находится здесь: http://jsfiddle.net/q5gbye2w/56/

// Take a single camel case string and convert it to a string of separate words (with spaces) at the camel-case boundaries.
// 
// E.g.:
//    ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D
//                                                  --> 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                        --> 1 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                         // "ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D"
            .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();


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

Ответ 6

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

Например:
thisIsCamelCase → Это дело верблюда
IsCamelCase → Это дело верблюда
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;
  }

Ответ 7

Хорошо, я на несколько лет опоздал в игру, но у меня был аналогичный вопрос, и я хотел сделать однозадачное решение для каждого возможного ввода. Я должен дать большую часть кредита @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 < a.length; i++){
    text = a[i];
    text = text.replace(camelEdges,'$1 ');
    text = text.charAt(0).toUpperCase() + text.slice(1);
    resultArray.push(text);
}

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

  • [A-Z](?=[A-Z][a-z]) ищет заглавную букву, за которой следует капитал, а затем строчный. Это должно означать сокращение акронимов, таких как США.
  • [^A-Z](?=[A-Z]) ищет неклассическую букву, за которой следует заглавная буква. Это заканчивается словами, такими как myWord и такими символами, как 99Bottles.
  • [a-zA-Z](?=[^a-zA-Z]) ищет письмо, за которым следует не письмо. Это заканчивается словами перед символами типа BFG9000.

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

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"

Ответ 11

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

CamelcaseToWord ( "MyName" );//возвращает My Name

    function CamelcaseToWord(string){
      return string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1");
    }

Ответ 12

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

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

Ответ 13

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

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'

Ответ 14

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

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

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(), 
              '')

Ответ 15

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

Входной

myCamelCaseSTRINGToSPLITDemo

Выход

my Camel Case STRING To SPLIT Demo


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

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

с $1 $2 в качестве замены.

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

Ответ 16

Входной

JavaScriptВыход Java Script

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

Ответ 17

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

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

const camelize = (str) => str
    .split(' ')
    .map(([first, ...theRest]) => (
        '${first.toUpperCase()}${theRest.join('').toLowerCase()}')
    )
    .join(' ');