如何用Go实现超长文本按规则分割为最大500字符的字符串数组?
解决方案
方法一:直接按字符位置匹配分割规则(推荐)
这个方法完全贴合你提出的分割逻辑,无需提前拆分单词,直接操作原字符串更高效:
package main import ( "strings" ) func SplitTextByLength(text string, maxLen int) []string { var result []string current := text for len(current) > maxLen { // 从maxLen位置开始往后查找第一个空格 splitIdx := strings.Index(current[maxLen:], " ") if splitIdx == -1 { // 未找到空格,直接按maxLen长度分割 result = append(result, current[:maxLen]) current = current[maxLen:] } else { // 找到空格,分割点为maxLen + splitIdx splitPos := maxLen + splitIdx result = append(result, current[:splitPos]) // 跳过空格,继续处理剩余文本 current = current[splitPos+1:] } } // 处理最后一段不足maxLen的文本 if current != "" { result = append(result, current) } return result }
逻辑说明:
- 循环处理剩余文本,每次判断是否超过最大长度
- 从第
maxLen位开始向后找空格,找到则在空格处分割,避免拆分单词 - 若找不到空格,直接按
maxLen硬分割 - 最后将剩余的短文本加入结果数组
方法二:改进你的单词拼接思路
如果你坚持用拆分单词的方式,可修改代码维护结果数组,同时处理单个超长单词的情况:
package main import ( "regexp" ) func SplitByWords(text string, maxLen int) []string { re := regexp.MustCompile(`\s+`) words := re.Split(text, -1) var result []string currentLine := "" for _, word := range words { var nextLen int if currentLine == "" { nextLen = len(word) } else { nextLen = len(currentLine) + 1 + len(word) } if nextLen <= maxLen { // 当前单词可加入行,拼接 if currentLine == "" { currentLine = word } else { currentLine += " " + word } } else { // 当前行加入结果,开始新行 result = append(result, currentLine) // 处理单个单词超过maxLen的情况 if len(word) > maxLen { result = append(result, word) currentLine = "" } else { currentLine = word } } } // 加入最后一行 if currentLine != "" { result = append(result, currentLine) } return result }
注意点:
- 这个方法会尽量把单词凑到不超过
maxLen的行,但可能会比maxLen短(因为下一个单词加进去会超) - 需要单独处理单个单词长度超过
maxLen的极端情况
内容的提问来源于stack exchange,提问作者alex
相关产品推荐
相关产品推荐

