我需要識別 twitter 訊息(各種語言、表情符號等)中的正確索引。
我找不到回傳這些位置的解決方案,如下例所示。
import (
"regexp"
"testing"
"github.com/stretchr/testify/require"
)
func TestA(t *testing.T) {
text := "???? [URGENT] Les forces de dissuasion #nucleaire de la #Russie"
var re = regexp.MustCompile(`#([_A-Za-z0-9] )`)
pos := re.FindAllStringIndex(text, -1)
// FindAllStringIndex returns
// [0][43,53]
// [1][60,67]
// These are the expected positions.
require.Equal(t, pos[0][0], 37)
require.Equal(t, pos[0][1], 47)
require.Equal(t, pos[1][0], 54)
require.Equal(t, pos[1][1], 61)
}
uj5u.com熱心網友回復:
該FindAllStringIndex()函式回傳位元組的位置,而不是符文。
您需要import "unicode/utf8"并使用utf8.RuneCountInString(text[:pos[0][0]])等等,而不是pos[0][0]確保您計算 Unicode 代碼點而不僅僅是位元組:
// You can edit this code!
// Click here and start typing.
package main
import (
"regexp"
"testing"
"unicode/utf8"
"github.com/stretchr/testify/require"
)
func TestA(t *testing.T) {
text := "???? [URGENT] Les forces de dissuasion #nucleaire de la #Russie"
var re = regexp.MustCompile(`#\w `)
pos := re.FindAllStringIndex(text, -1)
require.Equal(t, utf8.RuneCountInString(text[:pos[0][0]]), 37)
require.Equal(t, utf8.RuneCountInString(text[:pos[0][1]]), 47)
require.Equal(t, utf8.RuneCountInString(text[:pos[1][0]]), 54)
require.Equal(t, utf8.RuneCountInString(text[:pos[1][1]]), 61)
}
請參閱Go 演示。
此外,#\w 是一個較短的模式來匹配 a#和一個或多個字母、數字或下劃線。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/434812.html
上一篇:如何在golang中序列化字典
