Преобразовать camelCaseText в текст предложения - PullRequest
106 голосов
/ 29 августа 2011

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

Ответы [ 16 ]

129 голосов
/ 29 августа 2011
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".

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

72 голосов
/ 28 июля 2016

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

lodash.startCase(str);

Пример:

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

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

45 голосов
/ 29 августа 2011

У меня была похожая проблема, и я справился с ней так:

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
22 голосов
/ 27 сентября 2016

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

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());
11 голосов
/ 12 марта 2016

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

ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D

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

Чтобы получить свой GED вовремя, песня о 26 азбуках имеет существенное значение, но персональная идентификационная карта для пользователя 456 в комнате 26A, содержащая ABC 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);
}

С другой стороны, как пользователь Барно предложил , использование SugarJS - простое решение, если вы не возражаете против использования этой библиотеки. Однако я не уверен, что он обрабатывает тестовую строку, которую я описал выше; Я не пробовал на этом входе.

9 голосов
/ 26 мая 2014

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

Например:
thisIsCamelCase -> This Is Camel Case
this IsCamelCase-> Это верблюжий кейс
thisIsCamelCase123 -> Это верблюжий кейс123

  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 голосов
/ 08 января 2016

Хорошо, я несколько лет опаздываю к игре, но у меня был похожий вопрос, и я хотел найти решение с одной заменой для каждого возможного ввода. Я должен отдать большую часть заслуг @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 , чтобы механизм регулярных выражений не использовал слишком много символов:

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

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

4 голосов
/ 01 октября 2018

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

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

3 голосов
/ 29 августа 2011

Вы можете использовать функцию, подобную этой:

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

2 голосов
/ 23 июня 2016

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

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

    function CamelcaseToWord(string){
      return string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, " $1");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...