我正在使用RegExp来匹配序列0x1b
中[0xcb, 0x98, 0x1b]
以外的一系列字节:
var r = /[^\x1b]+/g;
r.exec(new Buffer([0xcb, 0x98, 0x1b]));
console.log(r.lastIndex);
我希望该模式与0xcb, 0x98
和r.lastIndex == 2
相匹配,但它仅匹配0xcb
和r.lastIndex == 1
。
这是一个错误还是什么?
答案 0 :(得分:1)
regexp.exec()
隐式将其参数转换为字符串,而Buffer
的{{1}}默认编码为UTF-8。因此,您将无法再使用该编码查看单个字节。相反,您需要明确使用toString()
编码(例如'latin1'
),这是一种单字节编码(使结果等同于Buffer.from([0xcb, 0x98, 0x1b]).toString('latin1')
)。
答案 1 :(得分:0)
RegExp.prototype.exec
适用于字符串。这意味着Buffer
方法将toString
隐式强制转换为字符串。
这样做时,字节被读作UTF-8字符串,因为UTF-8是默认编码。来自Node's Buffer documentation:
buf.toString([encoding[, start[, end]]])
encoding
<string>
要解码的字符编码。 默认:'utf8'
...
0xcb
和0x98
被读作单个UTF-8字符(˘
),因此第三个字节最终位于1个索引,而不是2个索引。
一个选项可能是使用不同的编码显式调用toString
方法,但我认为正则表达式可能不是最佳选择。
答案 2 :(得分:0)
您可以使用isolate(dt$data)[dt$cols]
返回包含不等于Array.prototype.filter()
0x1b