Converti camelCaseText in maiuscolo / minuscolo


145

Come posso convertire una stringa come "helloThere" o "HelloThere" in "Hello There" in JavaScript?


9
hmm .. qual è il tuo output atteso per iLiveInTheUSA?
mercoledì

8
Vivo nell'U ... oh merda! - Ma nel mio caso, ho un set limitato di stringhe e non ci sono stringhe che potrebbero spezzare un semplice convertitore. Buona cattura però!
HyderA

Allo stesso modo, uSBPort dovrebbe risultare in "Porta USB"
signonsridhar,

2
@wim: iLiveInTheUSA dovrebbe essere iLiveInTheUsa nella corretta notazione del caso cammello, ma ciò presenterebbe problemi diversi.
Konrad Höffner,

Risposte:


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

scrivere in maiuscolo la prima lettera, ad esempio.

Nota lo spazio in " $1".

EDIT: aggiunto un esempio di capitalizzazione della prima lettera. Naturalmente, nel caso in cui la prima lettera sia già maiuscola, avresti uno spazio libero da rimuovere.


1
Ho scavato l'uso degli spazi text.replace, ho
riempito le

8
uSBPorts => Porte USB, non quello che mi aspetto, voglio una porta USB
signonsridhar

che ne dici di scrivere come Non-GoogleChrome?
tim

107

In alternativa usando lodash :

lodash.startCase(str);

Esempio:

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

Lodash è una libreria eccellente per dare scorciatoia a molte attività js di tutti i giorni. Ci sono molte altre funzioni di manipolazione delle stringhe simili come camelCase, kebabCaseecc.


Se proverai per l' hello worldoutput dovrebbe essere Hello There, in questo caso loadash non sarà utile.
Abhishek Kumar,

@AbhishekKumar startIl caso di lodash verrà effettivamente convertito hello worldin Hello World lodash.com/docs/4.17.15#upperFirst
user1696017

Hai ragione fratello. Per errore ho scritto hello therea hello world.
Abhishek Kumar,

2
Ogni volta che penso "non c'è modo che anche lodash faccia questo", lo fa.
EFRU

Fai attenzione a partire da v4 questa funzione rimuove i caratteri speciali come ä e li converte in caratteri ASCII (a in questo caso)
collerek

52

Ho avuto un problema simile e ho affrontato in questo modo:

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

Per una soluzione più solida:

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

http://jsfiddle.net/PeYYQ/

Ingresso:

 helloThere 
 HelloThere 
 ILoveTheUSA
 iLoveTheUSA

Produzione:

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

mette in
moto

4
Non è un caso di condanna come richiesto dall'OP. La prima lettera dovrebbe essere in maiuscolo.
H Dog

Inoltre, aggiunge uno spazio in più tra le parole
Alacritas

34

Esempio senza effetti collaterali.

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

In ES6

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

1
Solido, +1 per lo snippet es6.
BradStell,

4
Cordiali saluti, questo aggiunge ulteriore spazio bianco all'inizio della frase.
Dale Zak,

20

La migliore stringa che ho trovato per testare le funzioni da caso cammello a titolo caso è questo esempio ridicolmente privo di senso, che verifica molti casi limite. Per quanto ne so, nessuna delle funzioni precedentemente pubblicate lo gestisce correttamente :

ToGetYourGEDInTimeASongAboutThe26ABCsIsOfTheEssenceButAPersonalIDCardForUser456InRoom26AContainingABC26TimesIsNotAsEasyAs123ForC3POOrR2D2Or2R2D

Questo dovrebbe essere convertito in:

Ottenere in tempo il tuo GED Una canzone sui 26 ABC è dell'essenza, ma una carta d'identità personale per l'utente 456 nella sala 26A contenente ABC 26 volte non è facile come 123 per C3PO o R2D2 o 2R2D

Se vuoi solo una semplice funzione che gestisca casi come quello sopra (e più casi di molte delle risposte precedenti), ecco quello che ho scritto. Questo codice non è particolarmente elegante o veloce, ma è semplice, comprensibile e funziona.

Un esempio eseguibile online è su jsfiddle , oppure puoi visualizzare l'output dello snippet di seguito nella tua console:

// Take a single camel case string and convert it to a string of separate words (with spaces) at the camel-case boundaries.
// 
// E.g.:
var examples = [
    '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);
}

examples.forEach(str => console.log(str, ' --> \n', camelCaseToTitleCase(str)));



10

Ok, sono in ritardo di qualche anno, ma avevo una domanda simile e volevo creare una soluzione a sostituzione singola per ogni possibile input. Devo dare la maggior parte del merito a @ZenMaster in questo thread e @Benjamin Udink ten Cate in questo thread. Ecco il codice:

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

Ha tre clausole, tutte che usano lookahead per impedire al motore regex di consumare troppi personaggi:

  1. [A-Z](?=[A-Z][a-z])cerca una lettera maiuscola seguita da una maiuscola e poi da una minuscola. Questo per porre fine agli acronimi come gli Stati Uniti.
  2. [^A-Z](?=[A-Z])cerca una lettera non maiuscola seguita da una lettera maiuscola. Questo finisce parole come myWord e simboli come 99Bottles.
  3. [a-zA-Z](?=[^a-zA-Z])cerca una lettera seguita da una non lettera. Questo termina le parole prima di simboli come BFG9000.

Questa domanda era in cima ai miei risultati di ricerca, quindi spero di poter risparmiare un po 'di tempo!


9

Ecco la mia versione di esso. Aggiunge uno spazio prima di ogni lettera inglese UpperCase che viene dopo una lettera inglese minuscola e, se necessario, rende maiuscola la prima lettera:

Ad esempio:
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;
  }

6

Questa implementazione prende in considerazione lettere maiuscole e numeri consecutivi.

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

Uscita prevista:

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

Vorrei usare la risposta di Chris Kline che si adatta a stringhe come "Indirizzo IP" (dove questa funzione lo trasforma in "Indirizzo IP"
John Hamm

@JohnHamm Il tuo input è "Indirizzo IP", giusto? Non è un caso di cammello! Leggi quale caso cammello è qui: en.wikipedia.org/wiki/Camel_case Non mettere spazio tra e inserire solo "IPAddress". Questa funzione funziona bene.
Dipu

3

Puoi usare una funzione come questa:

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"

Codice con un sacco di stringhe di test qui: http://jsfiddle.net/jfriend00/FWLuV/ .

Versione alternativa che mantiene gli spazi iniziali qui: http://jsfiddle.net/jfriend00/Uy2ac/ .


So che non era un requisito nella domanda, ma la tua soluzione non funziona " helloWorld", per esempio.
ZenMaster,

Sì, questo è un nuovo requisito. Ho provato a fare esattamente quello che avevi chiesto inizialmente. In ogni caso, la scorciatoia è facile da definire spazi iniziali se non ne hai bisogno comunque. Se li volessi lasciati al loro posto, anche questo potrebbe essere fatto.
jfriend00,

Ecco un jsFiddle che mostra un metodo che funziona con il nuovo requisito di "helloWorld" e mantiene lo spazio principale (se lo desideri): jsfiddle.net/jfriend00/Uy2ac .
jfriend00,

Bello. Tuttavia, mi chiedo delle sue prestazioni. La funzione gestore verrà chiamata ad ogni partita, no?
ZenMaster,

Se stai eseguendo un miliardo di questi in un'impostazione sensibile alle prestazioni, ci vorrebbe un po 'di test jsperf in un gruppo di browser per vedere quale sarebbe la soluzione più veloce. Chiamare una richiamata non è un grosso problema. Le espressioni regolari, di qualsiasi tipo, sono raramente la soluzione più rapida rispetto al codice per scopi speciali, ma salvano molto codice (e spesso alcuni bug), quindi spesso sono la scelta desiderata. Dipende dalle vostre esigenze.
jfriend00,

3

prova questa libreria

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"

2

Nessuna delle risposte sopra ha funzionato perfettamente per me, quindi ho dovuto venire con la propria bicicletta:

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');
}

Casi test:

null => ''
'' => ''
'simpleString' => 'Simple String'
'stringWithABBREVIATIONInside => 'String With ABBREVIATION Inside'
'stringWithNumber123' => 'String With Number 123'
'complexExampleWith123ABBR890Etc' => 'Complex Example With 123 ABBR 890 Etc'

2

Questo funziona per me, dai un'occhiata

CamelcaseToWord ( "MyName"); // restituisce il mio nome

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

1
Benvenuto in SO :) Aggiungi almeno una riga esplicativa al tuo codice. Assicurati anche che sia il tuo lavoro intellettuale o citi la (e) fonte (e).
Lorenz Lo Sauer,

Dovresti rimuovere lo spazio in uno "$ 1". string.replace(/([A-Z]+)/g, " $1").replace(/([A-Z][a-z])/g, "$1");
Valeria Shpiner,

2

Penso che questo possa essere fatto solo con il registro exp /([a-z]|[A-Z]+)([A-Z])/ge la sostituzione "$1 $2".

ILoveTheUSADope -> I Love The USA Dope


Non esattamente, per la stringa QWERTYrestituisce QWERT Y.
Itachi,

2

Se hai a che fare con Capital Camel Case questo frammento può aiutarti, inoltre contiene alcune specifiche in modo che tu possa essere sicuro che corrisponda al tuo caso.

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

E specifiche:

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')
 })
})

1

Non ho provato la risposta di tutti, ma le poche soluzioni con cui ho armeggiato non soddisfacevano tutti i miei requisiti.

Sono stato in grado di inventare qualcosa che ha fatto ...

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

Di seguito è riportato un link che mostra la stringa della custodia del cammello alla stringa di frase usando regex.

Ingresso

myCamelCaseSTRINGToSPLITDemo

Produzione

my Camel Case STRING To SPLIT Demo


Questo è regex per la conversione del caso del cammello in testo di frase

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

con $1 $2come sussidio.

Fare clic per visualizzare la conversione su regex


Fornisci i contenuti pertinenti dal tuo link nel corpo della tua risposta.
Grant Miller,

1

Immettere javaScript

Output script 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

Un'altra soluzione basata su RegEx.

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

Spiegazione

Il precedente RegEx è costituito da due parti simili separate dall'operatore OR . La prima metà:

  1. ([A-Z]) - corrisponde a lettere maiuscole ...
  2. (?=[A-Z][a-z]) - seguito da una sequenza di lettere maiuscole e minuscole.

Se applicato alla sequenza FOo , corrisponde effettivamente alla sua lettera F.

O il secondo scenario:

  1. ([a-z]) - corrisponde a lettere minuscole ...
  2. (?=[A-Z]) - seguito da una lettera maiuscola.

Se applicato alla sequenza barFoo , corrisponde effettivamente alla sua lettera r .

Quando sono stati trovati tutti i candidati sostitutivi, l'ultima cosa da fare è sostituirli con la stessa lettera ma con un carattere spazio aggiuntivo. Per questo possiamo usare '$& 'come rimpiazzo e si risolverà in una sottostringa abbinata seguita da un carattere spazio.

Esempio

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"]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.