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

ttcibm8c  于 2023-03-20  发布在  Java
关注(0)|答案(2)|浏览(117)

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

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

所以,我得到了我想要搜索的转义序列,然后我用一个正则表达式,从那个序列中得到一个数字,然后构造另一个正则表达式,来搜索转义序列,难道没有更简单,更好的方法吗?

wd2eg0qa

wd2eg0qa1#

如果您的问题是我所认为的那样,我认为更简单、更好的方法是直接转义您的模式并将其传递给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")
z31licg0

z31licg02#

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

  1. "code = ..."语句需要var- As-is,它正在污染全局命名空间。
  2. "code = ..."语句需要一些错误检查来处理错误的sequence输入。
    下面是我的改进方法:
// 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);
}

相关问题