2011-08-22 11 views
6

Tengo problemas para encontrar el problema con la función siguiente. Los primeros parámetros son una cadena que contiene códigos de color ANSI y el segundo parámetro es booleano.Cómo eliminar/reemplazar códigos de color ANSI de una cadena en Javascript

Si el valor booleano está establecido en false, se realiza una eliminación completa en la cadena.

Si el valor booleano está establecido en true, un bucle convierte todos los códigos de color en algo más fácil de analizar posteriormente.

Sospecho que el problema es RegExp, ya que se confunde entre 1; 33 y 0; 31 por algún 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)); 

La salida real es:

enter image description here

donde debe estar abcd{Gefgh{Yijkl

Alguien sabe qué le pasa ahora?

+0

El segundo parámetro de replaceColor es un booleano y reemplazará todos los códigos de color con una cadena fácil de leer (IMO) y fácil de analizar, o si se usa falso, eliminará todos los códigos de color encontrados. . – Cybrix

Respuesta

1

Su expresión regular que estaba mal. Debe ser "\\033\\[" + k + "m", no "\033\[[" + k + "]*m".

+0

¡De hecho! ¡Gracias! – Cybrix

7

Puede utilizar códigos octales en ambas cadenas y expresiones regulares

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

Esto funciona! ¿Cuál sería la solución usando un objeto RegExp? Estoy pensando en eliminar (su solución) o reemplazarla por una cadena equivalente/más fácil de recordar y analizar. – Cybrix

+1

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

+0

@ Àlvaro, gracias. Entonces, si quiero usar una variable dentro del parámetro RegExp esto debería funcionar: 'var byellow =" 1; 33 "; var re = new RegExp ("\ 033 \ [" + beellow + "* m", "g"); string = string.replace (re, "{Y}"); '? – Cybrix

Cuestiones relacionadas