2015-05-26 2 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, а представление UTF-8 символа U+0080. Это очевидно, если мы изменим тестовую программу для:

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

Смежные вопросы