为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
智慧大石 2022-11-15 10:47:05
我需要在 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)}
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

该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 #,然后是一个或多个字母、数字或下划线。


查看完整回答
反对 回复 2022-11-15
  • 1 回答
  • 0 关注
  • 48 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信