我需要将长度超过500个字符的文本拆分为几个array.完整的任务听起来是这样的:

消息被分成500个字符的块.如果消息超过500个字符,则从500个字符开始查找空格,如果找到空格,则在此位置将消息分成几个部分.如果找不到空格,则将消息除以500个字符.

我的决定,这只是个开始. 我们用正则表达式拆分文本,然后循环,如果长度允许,将数据添加到字符串中. 但我想我搞不懂了,我怎么才能得到一个字符串数组,这样每个字符串的长度才能合适地达到500个字符?

re := regexp.MustCompile(`\s+`)
res := re.Split(str, -1)

size := 500

finalString := ""
for i, _ := range res {
    if len(finalString+" "+res[i]) <= size {
        if len(finalString) == 0 {
            finalString += res[i]
        }
        finalString += " " + res[i]
    } else {
        break // can be added to a new line, and if the length is longer, I do not know what to do
    }
}

推荐答案

为了确保我理解正确,您希望在每500个字符后的第一个空格处拆分文本吗?

请记住,字符串连接可能相对代价较高(在字符串末尾添加两个字符(如finalString += " " + res[I])会导致O(N)复杂性,因为必须复制字符串的底层字节array.

一个更好的解决方案是依靠bytes.Buffer.我编写了这个示例代码(请注意,您可以更改splitLength--我不想在这里粘贴500个字符的输入).

package main

import (
    "bytes"
    "fmt"
)

func main() {
    prettyPrint(split([]byte("1234567 123 12345 1234567"), 5))
}

func prettyPrint(b [][]byte) {
    for _, a := range b {
        fmt.Println(string(a))
    }
}

func split(b []byte, splitLength int) [][]byte {
    current := new(bytes.Buffer)
    var bSlice [][]byte
    counter := 0
    shouldTerminate := false

    for i, c := range b {
        if shouldTerminate == true && c == byte(32) {
            counter = 0
            shouldTerminate = false

            bSlice = append(bSlice, current.Bytes())
            current = new(bytes.Buffer)

            continue
        }

        counter++
        current.Write([]byte{c})

        if counter > splitLength {
            shouldTerminate = true
        }

        if i == len(b)-1 {
            bSlice = append(bSlice, current.Bytes())
        }
    }

    return bSlice
}

Go相关问答推荐

杜松子wine -戈尼克背景在 children 围棋例行公事中被取消

无法在Macos上使用Azure Speech golang SDK

仅呈现一个模板的GIN Web应用程序

如何描述OpenAPI规范中围棋的数据类型.JSON?

减少在围棋中映射DTO时的重复代码量

如何使用gosdk在Dynamodb中进行UpdateItem时,将ValueBuilder对象声明为StringSet类型?

带有前导零的整数参数被 flag.IntVar 解析为八进制

用于提取 <*n 的正则表达式(其中 n 是一个数字)

无法使用带有 422 的 go-github 创建提交 - 更新不是快进

Yocto 无法交叉编译 GoLang Wails 应用程序

如何从 Asterisk Manager Interface Event 获取活动呼叫数

仅在工作日运行 cron

在 Raspberry Pi4 上下载 Go Mod

无法建立连接,因为目标机器主动拒绝它 Golang

gorm 获取列名

Golang:每个键具有多个值的映射

GORM GIN 更新查询导致 500 内部服务器错误

Go:如何通过 GIN-Router 从 AWS S3 将文件作为二进制流发送到浏览器?

关于GO的几个问题

Go 错误处理、类型断言和 net package包