java 拆分句子,并保留分隔符

浅浅的花香味﹌ 2023-02-22 12:26 88阅读 0赞

BreakUpSentence.java

  1. package com.example.demo.util;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7. /** * 功能:拆分句子 * 详情:根据分隔符拆分句子,并且保留分隔符。拆分后的句子限制字数是10以内 * * 拆分规则: * 分隔符(英文4个,中文4个) ,.?!,。?! * 最大字数限制(含标点):10 * 字数若超过限制,则在前一个分隔符切分。若前面没有分隔符,则在下一个分隔符切分 * * 句子案例: * 您好,请问可以听见吗? * 不好意思,这个我不会哎! * 很抱歉打扰到您了,祝您生活愉快,再见。 * 据报道,刘德华(华仔)日前为庆祝官方粉丝后援会华仔天地32周年,特地举办线上聚会,不仅献唱5首歌,还罕见谈到妻子和孩子的近况,相当宠粉,他也自嘲过去1年因生病和疫情影响巡演取消,发现自己眼角多了皱纹还长出白发,近日,他在后援会晒出近照,真实状态也曝光了。 */
  8. public class BreakUpSentence {
  9. /** 句子结束符. */
  10. private static final String SEPARATOR_REGEX = "[,.?!,。?!]";
  11. /** 字数限制(包含标点). */
  12. private static final Integer SIZE = 10;
  13. public static void main(String[] args) {
  14. //1. 需要拆分的句子
  15. String sentence = "很抱歉打扰到您了,祝您生活愉快,再见。";
  16. System.out.println("原句子:" + sentence);
  17. //2. 需要分割的文本
  18. String[] words = splitSentence(sentence);
  19. //3. 输出 words
  20. System.out.println("\n拆分后的句子:");
  21. Arrays.stream(words).forEach(System.out::println);
  22. //4. 限制拆分后的句子的字数在10位以内
  23. System.out.println("\n正在处理每个句子允许的字数是10以内中.....");
  24. List<String> wordList = limitNumber(words);
  25. //5. 输出限制后的数据
  26. System.out.println("\n最终处理完后的数据是: ");
  27. wordList.stream().forEach(word -> {
  28. System.out.println("word = " + word + "----------->length = " + word.length());
  29. });
  30. }
  31. /** * 通过分隔符拆分句子,并保留分隔符 * * 例如:很抱歉打扰到您了,祝您生活愉快,再见。 * 根据分隔符拆分: * 很抱歉打扰到您了, * 祝您生活愉快, * 再见。 * * @return */
  32. public static String[] splitSentence(String sentence){
  33. //1. 定义匹配模式
  34. Pattern p = Pattern.compile(SEPARATOR_REGEX);
  35. Matcher m = p.matcher(sentence);
  36. //2. 拆分句子[拆分后的句子符号也没了]
  37. String[] words = p.split(sentence);
  38. //3. 保留原来的分隔符
  39. if(words.length > 0){
  40. int count = 0;
  41. while(count < words.length){
  42. if(m.find()){
  43. words[count] += m.group();
  44. }
  45. count++;
  46. }
  47. }
  48. return words;
  49. }
  50. /** * 限制拆分后的句子的字数包括分隔符在10位以内 * * 例如: * 句子:很抱歉打扰到您了,祝您生活愉快,再见。 * 根据分隔符拆分后: * 很抱歉打扰到您了, * 祝您生活愉快, * 再见。 * 限制字数后: * 很抱歉打扰到您了, * 祝您生活愉快,再见。 * * @param words * @return */
  51. public static List limitNumber(String[] words){
  52. //1. 存储限制字数的数据
  53. List<String> wordList = new ArrayList<>();
  54. //2. 限制字数在10以内
  55. int wordsLength = words.length;
  56. for(int i = 0; i < wordsLength; i++){
  57. // 循环获取拆分后的每个句子
  58. String word = words[i];
  59. // 每个句子的长度
  60. int length = word.length();
  61. System.out.println("word = " + word + "-------------->length = " + length);
  62. // 当字数>=10,直接存储到wordList
  63. if(length >= SIZE){
  64. wordList.add(word);
  65. }else{
  66. // 防止ArrayIndexOutOfBoundsException
  67. if(i+1 >= wordsLength){
  68. wordList.add(word);
  69. return wordList;
  70. }
  71. // 获取下一个句子的长度
  72. String nextWord = words[i+1];
  73. int nextLength = nextWord.length();
  74. // 如果上一个句子的长度 + 下一个句子的长度 <= 10,那么拼接成一个句子
  75. int totalLength = length + nextLength;
  76. if(totalLength <= 10){
  77. wordList.add(word + nextWord);
  78. i++;
  79. }else{
  80. wordList.add(word);
  81. }
  82. }
  83. }
  84. return wordList;
  85. }
  86. }

输出

  1. 原句子:很抱歉打扰到您了,祝您生活愉快,再见。
  2. 拆分后的句子:
  3. 很抱歉打扰到您了,
  4. 祝您生活愉快,
  5. 再见。
  6. 正在处理每个句子允许的字数是10以内中.....
  7. word = 很抱歉打扰到您了,-------------->length = 9
  8. word = 祝您生活愉快,-------------->length = 7
  9. 最终处理完后的数据是:
  10. word = 很抱歉打扰到您了,----------->length = 9
  11. word = 祝您生活愉快,再见。----------->length = 10

发表评论

表情:
评论列表 (有 0 条评论,88人围观)

还没有评论,来说两句吧...

相关阅读