识别推文消息中正确的标签索引

我需要在 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)

}


智慧大石
浏览 69回答 1
1回答

MMTTMM

该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 mainimport (    "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 #,然后是一个或多个字母、数字或下划线。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go