2011-08-22 12 views
6

Ho difficoltà a trovare il problema con la funzione seguente. I primi parametri sono una stringa contenente i codici colore ANSI e il secondo parametro è un valore booleano.Come rimuovere/sostituire i codici colore ANSI da una stringa in Javascript

Se il valore booleano è impostato su false, viene eseguita una rimozione completa sulla stringa.

Se il valore booleano è impostato su true, un ciclo converte tutti i codici colore in qualcosa che è più semplice da analizzare in seguito.

Sospetto che lo RegExp sia il problema poiché è confuso tra 1; 33 e 0; 31 per qualche motivo.

var colorReplace = function(input, replace) { 
     var replaceColors = { 
      "0;31" : "{r", 
      "1;31" : "{R", 

      "0;32" : "{g", 
      "1;32" : "{G", 

      "0;33" : "{y", 
      "1;33" : "{Y", 

      "0;34" : "{b", 
      "1;34" : "{B", 

      "0;35" : "{m", 
      "1;35" : "{M", 

      "0;36" : "{c", 
      "1;36" : "{C", 

      "0;37" : "{w", 
      "1;37" : "{W", 

      "1;30" : "{*", 

      "0" : "{x" 
     }; 

     if (replace) 
     { 
      for(k in replaceColors) 
      { 
       //console.log("\033\[" + k + "m" + replaceColors[ k ]); 
       var re = new RegExp("\033\[[" + k + "]*m", "g"); 

       input = input.replace(re, replaceColors[ k ]); 
      } 
     } else { 
      input = input.replace(/\033\[[0-9;]*m/g, ""); 
     } 

     return input; 
    }; 

console.log("abcd\033[1;32mefgh\033[1;33mijkl\033[0m"); 
console.log(colorReplace("abcd\033[1;32mefgh\033[1;33mijkl", true)); 

L'uscita effettiva è:

enter image description here

dove dovrebbe essere abcd{Gefgh{Yijkl

Qualcuno sa che cosa c'è che non va in questo momento?

+0

Il secondo parametro di replaceColor è un valore booleano e sostituirà tutti i codici di colore con una stringa di facile lettura (IMO) e di facile analisi o se viene utilizzato falso, rimuoverà tutti i codici di colori trovati . – Cybrix

risposta

1

tuo Regex era sbagliato. Dovrebbe essere "\\033\\[" + k + "m", non "\033\[[" + k + "]*m".

+0

Infatti! Grazie! – Cybrix

7

È possibile utilizzare i codici ottale in entrambe le stringhe ed espressioni regolari

x = "\033[1mHello Bold World!\033[0m\n"; 
x = x.replace(/\033\[[0-9;]*m/,""); 
print(x); 
+0

Funziona! Quale sarebbe la soluzione utilizzando un oggetto RegExp? Sto pensando di rimuovere (la tua soluzione) o sostituire con una stringa equivalente/più facile da ricordare e analizzare. – Cybrix

+1

@Cybrix: '/ \ 033 \ [[0-9;] * m /' corrisponde a 'RegExp (" \ 033 \ [[0-9;] * m ")'. –

+0

@ Álvaro, grazie. Quindi, se voglio usare una variabile all'interno del parametro RegExp, dovrebbe funzionare: 'var byellow =" 1; 33 "; var re = new RegExp ("\ 033 \ [" + byellow + "* m", "g"); string = string.replace (re, "{Y}"); '? – Cybrix

Problemi correlati