java 拆分句子,并保留分隔符
BreakUpSentence.java
package com.example.demo.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** * 功能:拆分句子 * 详情:根据分隔符拆分句子,并且保留分隔符。拆分后的句子限制字数是10以内 * * 拆分规则: * 分隔符(英文4个,中文4个) ,.?!,。?! * 最大字数限制(含标点):10 * 字数若超过限制,则在前一个分隔符切分。若前面没有分隔符,则在下一个分隔符切分 * * 句子案例: * 您好,请问可以听见吗? * 不好意思,这个我不会哎! * 很抱歉打扰到您了,祝您生活愉快,再见。 * 据报道,刘德华(华仔)日前为庆祝官方粉丝后援会华仔天地32周年,特地举办线上聚会,不仅献唱5首歌,还罕见谈到妻子和孩子的近况,相当宠粉,他也自嘲过去1年因生病和疫情影响巡演取消,发现自己眼角多了皱纹还长出白发,近日,他在后援会晒出近照,真实状态也曝光了。 */
public class BreakUpSentence {
/** 句子结束符. */
private static final String SEPARATOR_REGEX = "[,.?!,。?!]";
/** 字数限制(包含标点). */
private static final Integer SIZE = 10;
public static void main(String[] args) {
//1. 需要拆分的句子
String sentence = "很抱歉打扰到您了,祝您生活愉快,再见。";
System.out.println("原句子:" + sentence);
//2. 需要分割的文本
String[] words = splitSentence(sentence);
//3. 输出 words
System.out.println("\n拆分后的句子:");
Arrays.stream(words).forEach(System.out::println);
//4. 限制拆分后的句子的字数在10位以内
System.out.println("\n正在处理每个句子允许的字数是10以内中.....");
List<String> wordList = limitNumber(words);
//5. 输出限制后的数据
System.out.println("\n最终处理完后的数据是: ");
wordList.stream().forEach(word -> {
System.out.println("word = " + word + "----------->length = " + word.length());
});
}
/** * 通过分隔符拆分句子,并保留分隔符 * * 例如:很抱歉打扰到您了,祝您生活愉快,再见。 * 根据分隔符拆分: * 很抱歉打扰到您了, * 祝您生活愉快, * 再见。 * * @return */
public static String[] splitSentence(String sentence){
//1. 定义匹配模式
Pattern p = Pattern.compile(SEPARATOR_REGEX);
Matcher m = p.matcher(sentence);
//2. 拆分句子[拆分后的句子符号也没了]
String[] words = p.split(sentence);
//3. 保留原来的分隔符
if(words.length > 0){
int count = 0;
while(count < words.length){
if(m.find()){
words[count] += m.group();
}
count++;
}
}
return words;
}
/** * 限制拆分后的句子的字数包括分隔符在10位以内 * * 例如: * 句子:很抱歉打扰到您了,祝您生活愉快,再见。 * 根据分隔符拆分后: * 很抱歉打扰到您了, * 祝您生活愉快, * 再见。 * 限制字数后: * 很抱歉打扰到您了, * 祝您生活愉快,再见。 * * @param words * @return */
public static List limitNumber(String[] words){
//1. 存储限制字数的数据
List<String> wordList = new ArrayList<>();
//2. 限制字数在10以内
int wordsLength = words.length;
for(int i = 0; i < wordsLength; i++){
// 循环获取拆分后的每个句子
String word = words[i];
// 每个句子的长度
int length = word.length();
System.out.println("word = " + word + "-------------->length = " + length);
// 当字数>=10,直接存储到wordList
if(length >= SIZE){
wordList.add(word);
}else{
// 防止ArrayIndexOutOfBoundsException
if(i+1 >= wordsLength){
wordList.add(word);
return wordList;
}
// 获取下一个句子的长度
String nextWord = words[i+1];
int nextLength = nextWord.length();
// 如果上一个句子的长度 + 下一个句子的长度 <= 10,那么拼接成一个句子
int totalLength = length + nextLength;
if(totalLength <= 10){
wordList.add(word + nextWord);
i++;
}else{
wordList.add(word);
}
}
}
return wordList;
}
}
输出
原句子:很抱歉打扰到您了,祝您生活愉快,再见。
拆分后的句子:
很抱歉打扰到您了,
祝您生活愉快,
再见。
正在处理每个句子允许的字数是10以内中.....
word = 很抱歉打扰到您了,-------------->length = 9
word = 祝您生活愉快,-------------->length = 7
最终处理完后的数据是:
word = 很抱歉打扰到您了,----------->length = 9
word = 祝您生活愉快,再见。----------->length = 10
还没有评论,来说两句吧...