2011-08-22 9 views
6

Mam problem ze znalezieniem problemu z poniższą funkcją. Pierwszymi parametrami jest ciąg znaków zawierający kody kolorów ANSI , a drugi parametr to boolean.Jak usunąć/zastąpić kody kolorów ANSI z ciągu znaków w JavaScript

Jeśli wartość boolowska jest ustawiona na false, następuje całkowite usunięcie ciągu.

Jeśli wartość boolowska jest ustawiona na true, pętla przekształca wszystkie kody kolorów w coś łatwiejszego do przeanalizowania później.

Podejrzewam, że problemem jest RegExp, ponieważ z jakiegoś powodu jest on pomieszany między 1, 33 a 0; 31.

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

Rzeczywista moc wynosi:

enter image description here

gdzie powinien być abcd{Gefgh{Yijkl

ktoś wie co się dzieje teraz?

+0

Drugi parametr metody replaceColor jest wartością boolowską i zastąpi wszystkie kody kolorów łatwym do odczytania (IMO) i łatwym do przeanalizowania ciągiem znaków lub jeśli użyta zostanie wartość false, usunie wszystkie znalezione kody kolorów . – Cybrix

Odpowiedz

1

Twój Regex myliłem. Powinien to być "\\033\\[" + k + "m", a nie "\033\[[" + k + "]*m".

+0

Rzeczywiście! Dzięki! – Cybrix

7

można wykorzystywać kody ósemkowe w obu ciągów i wyrażeniach regularnych

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

To działa! Jakie byłoby rozwiązanie przy użyciu obiektu RegExp? Myślę o usunięciu (twoje rozwiązanie) lub zastąpieniu równoważnym/łatwiejszym do zapamiętania i przeanalizowania ciągiem znaków. – Cybrix

+1

@Cybrix: '/ \ 033 \ [[0-9;] * m /' równa się "RegExp (" \ 033 \ [[0-9;] * m ")'. –

+0

@ Àlvaro, Dziękuję. Następnie, jeśli chcę użyć zmiennej wewnątrz parametru RegExp, powinno to działać: 'var byellow =" 1; 33 "; var re = new RegExp ("\ 033 \ [" + byellow + "* m", "g"); string = string.replace (re, "{Y}"); '? – Cybrix

Powiązane problemy