105 lines
3.3 KiB
Java
105 lines
3.3 KiB
Java
package com.cmvr.test.util;
|
||
|
||
import cn.hutool.core.util.StrUtil;
|
||
|
||
import java.util.ArrayList;
|
||
import java.util.List;
|
||
|
||
public class TextSplitUtil {
|
||
|
||
private static final int DEFAULT_MAX_LENGTH = 20;
|
||
|
||
public static List<String> splitText(String text) {
|
||
return splitText(text, DEFAULT_MAX_LENGTH);
|
||
}
|
||
|
||
public static List<String> splitText(String text, int maxLength) {
|
||
List<String> result = new ArrayList<>();
|
||
if (StrUtil.isEmpty(text)) {
|
||
return result;
|
||
}
|
||
|
||
// 0. 清洗
|
||
text = cleanText(text);
|
||
|
||
// 1. 先按句号/问号/感叹号切
|
||
String[] sentences = text.split("(?<=[。!?])");
|
||
for (int i = 0; i < sentences.length; i++) {
|
||
String sentence = sentences[i].trim();
|
||
if (StrUtil.isEmpty(sentence)) {
|
||
continue;
|
||
}
|
||
|
||
// 特殊规则:第一句单独处理
|
||
if (i == 0 && sentence.length() > 15) {
|
||
int cut = Math.min(sentence.length(), 15); // 最多15
|
||
if (cut < 10) cut = 10; // 保底至少10
|
||
result.add(sentence.substring(0, cut));
|
||
|
||
// 剩余部分继续走正常分割
|
||
String remain = sentence.substring(cut).trim();
|
||
if (StrUtil.isNotEmpty(remain)) {
|
||
if (remain.length() > maxLength) {
|
||
result.addAll(splitByComma(remain, maxLength));
|
||
} else {
|
||
result.add(remain);
|
||
}
|
||
}
|
||
continue;
|
||
}
|
||
|
||
// 2. 如果太长,按逗号/分号切
|
||
if (sentence.length() > maxLength) {
|
||
result.addAll(splitByComma(sentence, maxLength));
|
||
} else {
|
||
result.add(sentence);
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* 先按逗号/分号切,再兜底按长度切
|
||
*/
|
||
private static List<String> splitByComma(String text, int maxLength) {
|
||
List<String> result = new ArrayList<>();
|
||
String[] parts = text.split("(?<=[,;])"); // 保留逗号/分号
|
||
for (String part : parts) {
|
||
part = part.trim();
|
||
if (StrUtil.isEmpty(part)) {
|
||
continue;
|
||
}
|
||
if (part.length() > maxLength) {
|
||
result.addAll(splitByLength(part, maxLength));
|
||
} else {
|
||
result.add(part);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* 长句按长度强制切分(兜底)
|
||
*/
|
||
private static List<String> splitByLength(String text, int maxLength) {
|
||
List<String> result = new ArrayList<>();
|
||
for (int i = 0; i < text.length(); i += maxLength) {
|
||
int end = Math.min(text.length(), i + maxLength);
|
||
result.add(text.substring(i, end).trim());
|
||
}
|
||
return result;
|
||
}
|
||
|
||
private static String cleanText(String text) {
|
||
if (StrUtil.isEmpty(text)) {
|
||
return text;
|
||
}
|
||
String cleaned = text;
|
||
cleaned = cleaned.replaceAll("[\\r\\n\\t]+", " "); // 换行制表
|
||
cleaned = cleaned.replaceAll(" +", " "); // 多余空格
|
||
cleaned = cleaned.replaceAll("[-=*]{3,}", " "); // 分隔符
|
||
return cleaned.trim();
|
||
}
|
||
}
|