2015-05-26 145 views
0

在某些簡單情況下,我無法regexp.FindSubmatch。例如,下面的代碼工作正常:用十六進制字符代碼regexp.FindSubmatch

assigned := regexp.MustCompile(`\x7f`) 
group := assigned.FindSubmatch([]byte{0x7f}) 
fmt.Println(group) 

in playground it prints [[127]]

但是,如果我改變字節爲0x80它does not work。爲什麼?

+3

'regexp'使用UTF-8編碼的字符串進行操作; '{0x80}'不是有效的UTF-8編碼字符串。 –

+0

傷心。我從PowerShell移動我的代碼,在那裏我沒有二進制數據的限制。 – algebrain

+1

['bytes.Contains'](https://godoc.org/bytes#Contains)可能替代您。 –

回答

1

如前所述in the package documentation

所有字符都是UTF-8編碼的代碼點。

所以正則表達式\x80不匹配字節值0x80,而是字符U+0080的UTF-8表示。

func main() { 
    assigned := regexp.MustCompile(`\x80`) 
    group := assigned.FindSubmatch([]byte{1, 2, 3, 0xc2, 0x80}) 
    fmt.Println(group) 
} 

現在我們得到兩個字節序列[[194 128]],它代表了疑問,性格匹配:如果我們改變你的測試程序,這是顯而易見的。

無法將regexp包切換爲二進制模式,因此您需要將輸入轉換爲有效的UTF-8,或使用其他包來匹配數據。

+0

謝謝。我覺得這個限制在FindStringSubmatch的情況下是適當的,但是對於FindSubmatch來說這很奇怪和不方便。 – algebrain

相關問題