包含JavaScript中的转义序列的正则表达式

时间:2011-12-16 06:52:04

标签: javascript regex console coffeescript ansi

我有一个包含颜色转义序列的字符串,如:

"white text \x1b[33m yellow text \x1b[32m green text"

现在我需要替换某个转义序列的所有出现。我只得到我要寻找的逃脱序列,这就是我所拥有的。据我所知,JavaScript中替换所有出现的东西的唯一方法是使用正则表达式。

// replace all occurences of one sequence string with another
function replace(str, sequence, replacement) {
  // get the number of the reset colour sequence
  code = sequence.replace(/\u001b\[(\d+)m/g, '$1');
  // make it a regexp and replace all occurences with the start colour code
  return str.replace(new RegExp('\\u001b\\[' + code + 'm', 'g'), replacement);
}

所以,我得到了我想要搜索的转义序列,然后我使用正则表达式从该序列中获取一个数字,只是为了构造另一个搜索转义序列的正则表达式。是不是有更简单,更好的方式?

2 个答案:

答案 0 :(得分:1)

如果您的问题是我认为的问题,我认为更简单,更好的方法就是转义您的模式并将其直接传递给RegExp构造函数,如我的旧问题所示

How do I do global string replace without needing to escape everything?

function escape(s) {
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
};

function replace_all(str, pattern, replacement){
    return str.replace( new RegExp(escape(pattern), "g"), replacement);
}

replace_all(my_text, "\x1b[33m", "REPLACEMENT")

答案 1 :(得分:0)

OP中的原始解决方案非常有效,我看到它只有两个问题。

  1. "code = ..."语句需要var - 因为它正在污染全局命名空间。
  2. "code = ..."语句需要进行一些错误检查才能处理错误的sequence输入。
  3. 以下是我如何改进它:

    // replace all occurrences of one ANSI escape sequence with another.
    function replace(str, sequence, replacement) {
      // Validate input sequence and extract color number.
      var code = sequence.match(/^\x1b\[(\d+)m$/);
      if (!code) {  // Handle invalid escape sequence.
        alert('Error! Invalid escape sequence');
        return str;
      }
      // make it a regexp and replace all occurrences with the start color code
      return str.replace(new RegExp('\\x1b\\[' + code[1] + 'm', 'g'), replacement);
    }