我有一个包含颜色转义序列的字符串,如:
"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);
}
所以,我得到了我想要搜索的转义序列,然后我使用正则表达式从该序列中获取一个数字,只是为了构造另一个搜索转义序列的正则表达式。是不是有更简单,更好的方式?
答案 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中的原始解决方案非常有效,我看到它只有两个问题。
"code = ..."
语句需要var
- 因为它正在污染全局命名空间。"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);
}