JavaScript RegExp匹配二进制数据

时间:2017-05-13 00:21:03

标签: javascript node.js regex

我正在使用RegExp来匹配序列0x1b[0xcb, 0x98, 0x1b]以外的一系列字节:

var r = /[^\x1b]+/g;
r.exec(new Buffer([0xcb, 0x98, 0x1b]));
console.log(r.lastIndex);

我希望该模式与0xcb, 0x98r.lastIndex == 2相匹配,但它仅匹配0xcbr.lastIndex == 1。 这是一个错误还是什么?

3 个答案:

答案 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'

     

...

0xcb0x98被读作单个UTF-8字符(˘),因此第三个字节最终位于1个索引,而不是2个索引。

一个选项可能是使用不同的编码显式调用toString方法,但我认为正则表达式可能不是最佳选择。

答案 2 :(得分:0)

您可以使用isolate(dt$data)[dt$cols] 返回包含不等于Array.prototype.filter()

的值的数组
0x1b