2017-05-13 35 views
0

我使用正則表達式來從序列[0xcb, 0x98, 0x1b]匹配一系列比其他0x1b字節:JavaScript的正則表達式匹配的二進制數據

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

我預計該模式將匹配0xcb, 0x98r.lastIndex == 2,但它僅匹配0xcbr.lastIndex == 1。 這是一個錯誤或什麼?

+0

預期結果是什麼? '[203,152]'? – guest271314

+0

是的,[0xcb,0x98] –

回答

0

regexp.exec()其參數隱式轉換爲字符串和用於toString()Buffer的默認編碼是UTF-8。因此,您將無法再使用該編碼查看單個字節。相反,您需要明確使用'latin1'編碼(例如Buffer.from([0xcb, 0x98, 0x1b]).toString('latin1')),這是一種單字節編碼(使結果相當於'\xcb\x98\x1b')。

0

RegExp.prototype.exec適用於字符串。這意味着通過toString方法將Buffer隱式轉換爲字符串。

這樣做時,字節讀取爲UTF-8字符串,因爲UTF-8是默認編碼。從Node's Buffer documentation

buf.toString([encoding[, start[, end]]]) 

encoding<string>字符編碼解碼來。 默認:'utf8'

...

0xcb0x98被讀取作爲一個單一的UTF-8字符(˘),從而第三字節結束是在1個索引,而不是2索引。

一個選項可能是明確調用toString方法使用不同的編碼,但我認爲正則表達式可能不是這裏最好的選擇。

0

可以使用Array.prototype.filter()含有值不等於一個數組返回0x1b

new Buffer([0xcb, 0x98, 0x1b].filter(byte => byte !== 0x1b))