2015-11-22 21 views
7

devo convertire tutti i caratteri inferiori alla tomaia e tutto superiore a quella inferiore in qualche stringa.Converti caratteri superiore a quella inferiore e inferiore superiore (viceversa)

Ad esempio

var testString = 'heLLoWorld'; 

Dovrebbe essere

'HEllOwORLD' 

dopo la conversione.

Qual è il modo più elagant per implementare questo, senza salvare stringa di temperatura.

mi sarebbe molto più meglio se raggiungere tale risultato utilizzando le espressioni regolari.

Grazie.

+0

come stringhe JavaScript sono immutabili questo è tecnicamente impossibile, è necessario finire con almeno una stringa aggiuntiva (che si può ovviamente assegnare di nuovo al 'testString', ma la stringa supplementare era ancora lì.) Tutte le risposte finora finiscono con copie della stringa, 2 con due copie (una in un array e una in una stringa in un caso, entrambe negli array nel secondo), una con una copia esplicita in una seconda stringa. – blm

+0

Vedere [questa demo] (https://jsfiddle.net/q6rqy2bp/) in base alla risposta alla domanda originale. –

risposta

4

Ecco una soluzione espressione regolare, che sfrutta il fatto che le lettere maiuscole e minuscole differiscono dal bit corrispondente al decimale 32:

var testString = 'heLLo World 123', 
 
    output; 
 

 
output= testString.replace(/([a-zA-Z])/g, function(a) { 
 
      return String.fromCharCode(a.charCodeAt()^32); 
 
     }) 
 
    
 
document.body.innerHTML= output;

+1

soluzione elegante per ASCII-/stringhe alfabeto di base, ma non funziona per i caratteri unicode: ' "c" .tolowercase() == "C"' 'ma String.fromCharCode ("C"^32) = "C" ' –

+0

Sì, la vita era molto più semplice nei giorni ASCII a 8 bit. –

3

Ecco un'idea:

function flipCase(str) { 
    return str.split('').reduce(function(str, char) { 
    return str + (char.toLowerCase() === char 
     ? char.toUpperCase() 
     : char.toLowerCase()); 
    }, ''); 
} 
1
testString.split('').map(function(c) { 
    var f = 'toUpperCase'; 
    if(c === c.toUpperCase()) {f = 'toLowerCase';} 
    return c[f](); 
}).join(''); 
2

Ecco un'idea con RegEx

var testString = 'heLLoWorld'; 
var newString = ''; 
for(var i =0; i< testString.length; i++){ 
    if(/^[A-Z]/.test(testString[i])){ 
     newString+= testString[i].toLowerCase(); 
    } else { 
     newString+= testString[i].toUpperCase(); 
    } 
} 

lavorare exaple qui http://jsfiddle.net/39khs/1413/

+0

Qualcosa come str.replace (/./g, funzione (c) {return case-modified o original c;}) è discutibilmente più elegante, che è una richiesta nella domanda. – blm

+0

Inoltre, quanto sopra non avrà caratteri maiuscoli ma non ASCII, ad esempio 'Å' rimane lo stesso ma dovrebbe trasformarsi in 'å'. – blm

+0

Era solo un'idea, non ho molta esperienza con JS, ma sto cercando i tuoi suggerimenti, grazie. –

Problemi correlati