Javascript camelCase to Regular Form

Ho cercato di ottenere un comando regex JavaScript per trasformare qualcosa come thisString in This String ma il più vicino che ho ottenuto è la sostituzione di una lettera, risultante in qualcosa come Thi String o This tring . Qualche idea?

Per chiarire posso gestire la semplicità di capitalizzare una lettera, non sono così forte con RegEx e dividere something Like This in something Like This è dove ho dei problemi.

 "thisStringIsGood" // insert a space before all caps .replace(/([AZ])/g, ' $1') // uppercase the first character .replace(/^./, function(str){ return str.toUpperCase(); }) 

visualizza

 This String Is Good 
 (function() { var $textbox = $('#textbox'), $result = $('#result'), splitter = function() { $result.html($textbox.val() // insert a space before all caps .replace(/([AZ])/g, ' $1') // uppercase the first character .replace(/^./, function(str) { return str.toUpperCase(); })); }; $textbox.on('input', splitter); splitter(); }()); 
 #result { margin-top: 10px; padding-top: 10px; border-top: solid 1px #c3c3c3; } 
  
Text to split

Ho avuto un minimo interesse in questo, in particolare nella gestione delle sequenze di lettere maiuscole, come in xmlHTTPRequest. Le funzioni elencate produrranno “Xml HTTP Request” o “Xml HTTPRequest”, il mio produce “Xml HTTP Request”.

 function unCamelCase (str){ return str // insert a space between lower & upper .replace(/([az])([AZ])/g, '$1 $2') // space before last upper in a sequence followed by lower .replace(/\b([AZ]+)([AZ])([az])/, '$1 $2$3') // uppercase the first character .replace(/^./, function(str){ return str.toUpperCase(); }) } 

C’è anche una versione String.prototype in un gist .

Questo può essere fatto concisamente con regex lookahead ( live demo ):

 function splitCamelCaseToString(s) { return s.split(/(?=[AZ])/).join(' '); } 

(Pensavo che la flag g (globale) fosse necessaria, ma stranamente, non è in questo caso particolare.)

Usando lookahead con split assicura che la lettera maiuscola corrispondente non venga consumata ed eviti di occuparsi di uno spazio iniziale se UpperCamelCase è qualcosa che devi affrontare. Per scrivere in maiuscolo la prima lettera di ciascuno, puoi usare:

 function splitCamelCaseToString(s) { return s.split(/(?=[AZ])/).map(function(p) { return p.charAt(0).toUpperCase() + p.slice(1); }).join(' '); } 

Il metodo della matrice di map è una funzione ES5, ma puoi ancora usarla nei browser più vecchi con del codice da MDC . In alternativa, è ansible scorrere gli elementi dell’array usando un ciclo for .

Penso che questo dovrebbe essere in grado di gestire i caratteri maiuscoli consecutivi e il semplice camelCase.

Ad esempio: someVariable => someVariable, ma ABCCode! = ABC Code.

La regex riportata di seguito funziona sull’esempio, ma anche l’esempio comune di rappresentazione delle abbreviazioni in camcelCase.

 "somethingLikeThis" .replace(/([az])([AZ])/g, '$1 $2') .replace(/([AZ])([az])/g, ' $1$2') .replace(/\ +/g, ' ') => "something Like This" "someVariableWithABCCode" .replace(/([az])([AZ])/g, '$1 $2') .replace(/([AZ])([az])/g, ' $1$2') .replace(/\ +/g, ' ') => "some Variable With ABC Code" 

Puoi anche regolare come sopra per capitalizzare il primo carattere.

 function spacecamel(s){ return s.replace(/([az])([AZ])/g, '$1 $2'); } 

spacecamel ( ‘somethingLikeThis’)

// valore restituito: qualcosa come questo

Una soluzione che gestisce anche i numeri:

 function capSplit(str){ return str.replace ( /(^[az]+)|[0-9]+|[AZ][az]+|[AZ]+(?=[AZ][az]|[0-9])/g , function(match, first){ if (first) match = match[0].toUpperCase() + match.substr(1); return match + ' '; } ) } 

Testato qui [JSFiddle, no library. Non provato IE]; dovrebbe essere abbastanza stabile

Lodash lo gestisce bene con _.startCase()

Se non ti preoccupi dei browser più vecchi (o non ti importa usare una funzione di fallback per ridurli), questo può dividere anche stringhe come ‘xmlHTTPRequest’ (ma certamente non ci sono caratteri simili a ‘XMLHTTPRequest’).

 function splitCamelCase(str) { return str.split(/(?=[AZ])/) .reduce(function(p, c, i) { if (c.length === 1) { if (i === 0) { p.push(c); } else { var last = p.pop(), ending = last.slice(-1); if (ending === ending.toLowerCase()) { p.push(last); p.push(c); } else { p.push(last + c); } } } else { p.push(c.charAt(0).toUpperCase() + c.slice(1)); } return p; }, []) .join(' '); } 

Non regex, ma utile per conoscere semplici vecchie tecniche come questa.

 var origString = "thisString"; var newString = origString.charAt(0).toUpperCase() + origString.substring(1);