2011-08-22 60 views
6

我無法找到下面的函數的問題。第一個參數是包含ANSI 顏色代碼的字符串,第二個參數是布爾值。如何從Javascript中的字符串中刪除/替換ANSI顏色代碼

如果布爾值設置爲false,則會對字符串進行完全刪除。

如果布爾值設置爲true,則循環會將每個顏色代碼轉換爲稍後更易於解析的東西。

我懷疑RegExp是因爲它由於某種原因在1; 33和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)); 

實際的輸出是:

enter image description here

,它應該是abcd{Gefgh{Yijkl

任何人都知道現在是怎麼回事?

+0

replaceColor的第二個參數是一個布爾值,它將用易於閱讀的(IMO)和容易解析的字符串替換所有的顏色代碼,或者如果使用false,它將刪除所有找到的顏色代碼。 – Cybrix

回答

1

您正則表達式是錯誤的。它應該是"\\033\\[" + k + "m",而不是"\033\[[" + k + "]*m"

+0

確實!謝謝! – Cybrix

7

您可以使用兩個字符串八進制代碼和正則表達式

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

This Works!使用RegExp對象的解決方案是什麼?我正在考慮刪除(你的解決方案)或更換一個等效/更容易記住和解析字符串。 – Cybrix

+1

@Cybrix:'/ \ 033 \ [[0-9;] * m /'等於'RegExp(「\ 033 \ [[0-9;] * m」)'。 –

+0

@Àlvaro,謝謝。然後,如果我想在RegExp參數中使用一個變量,它應該可以工作:'var byellow =「1; 33」; var re = new RegExp(「\ 033 \ [」+ byellow +「* m」,「g」); string = string.replace(re,「{Y}」);'? – Cybrix

相關問題