【问题标题】:How would I go about splitting a sentence in Java [duplicate]我将如何在Java中拆分一个句子[重复]
【发布时间】:2014-07-31 09:49:17
【问题描述】:

我正在尝试拆分正在打印到控制台的句子,以避免像 @ 80 chars 这样的截断:

Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave ad
venturer?

所以我希望它像这样打印

Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave 
adventurer?

有没有办法用String.split() 做到这一点?

【问题讨论】:

  • 打印时可以使用\n吗?
  • 我只想有一个方法可以传递一串文本,然后它会为我过滤和调整它。如果不清楚,我深表歉意。
  • 哦,谢谢!我没找到那个!
  • 谢谢,有些人想出的算法很棒

标签: java regex string split


【解决方案1】:

你可以做这样的事情,根据行的当前大小决定是否换行:

public static String getLines(String line){

    String[] words = line.split(" ");
    StringBuilder str = new StringBuilder();
    int size = 0;
    for (int i = 0; i < words.length; i++) {
        if(size==0){
            str.append(words[i]);
        }
        if(size+words[i].length()+1<=80){
            str.append(" ").append(words[i]);
            size++;
        }else{
            str.append("\n").append(words[i]);
            size = 0;
        }
        size+=words[i].length();
    }
    return str.toString();
}

另一种不同的做法:

public static String getLines2(String line){
    StringBuilder str = new StringBuilder();
    int begin = 0;

    while(begin<line.length()){
        int lineEnd = Math.min(begin + 80, line.length());
        while(lineEnd<line.length()&&line.charAt(lineEnd)!= ' '){
            lineEnd--;
        }
        str.append(line.subSequence(begin, lineEnd));
        if(lineEnd<line.length()) str.append("\n");
        begin = lineEnd+1;
    }
    return str.toString();
}

【讨论】:

    【解决方案2】:

    根据它的精确程度,Regex 可以很好地做到这一点。如果你只需要在空格处分割,一个简单的

    String eg = "Example sentence with, some. spaces! and stuff";
    String[] splitSentence = eg.split(" ");
    

    将完成这项工作,在每个空格处拆分字符串,从而将带有相邻特殊字符的单词作为字符串数组返回。然后,您可以简单地添加字符(中间有空格),如果您通过边界(在您的情况下为 80),弹出最后一个单词并添加 '\n'

    String getConsoleFormattedString(String s, int rowLength) {
      String[] split = s.split(" ");
      String ret = "";
      int counter = 0,
    
      for(int i = 0; i < split.length; i++) {
        if(counter + split[i] + 1 <= 80)
          ret += split[i] + " ";
        else {
          ret += "\n";
          counter = 0;
          i--;
        }
      }
    
      return ret;
    }
    

    为了简单起见,我会让你弄清楚如何处理超过 80 个字母的单词

    【讨论】:

      【解决方案3】:

      split 不是这里的最佳选择,但您可以在此正则表达式中使用 PatternMatcher

      \\G.{1,80}(\\s+|$)
      

      意思是

      • \\G 最后匹配的位置,或者如果它是搜索匹配的第一次迭代(所以还没有)字符串的开始(由^ 表示)
      • .{1,80} 任何字符都可以出现一到八十次
      • (\\s+|$) 一个或多个空格或字符串结尾

      你可以这样使用它

      String data = "Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave "
              + "adventurer? ";
      Pattern p = Pattern.compile("\\G.{1,80}(\\s+|$)");
      Matcher m = p.matcher(data);
      while(m.find())
          System.out.println(m.group().trim());
      

      输出:

      Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave
      adventurer?
      

      但是假设您可以面对不应该拆分的很长的单词,您可以添加

      \\S{80,}
      

      到您的正则表达式也让它找到长度为 80 或更多的非空白字符串。

      例子:

      String data = "Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave "
              + "adventurer? foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar";
      
      Pattern p = Pattern.compile("\\G.{1,80}(\\s+|$)|\\S{80,}");
      Matcher m = p.matcher(data);
      while (m.find())
          System.out.println(m.group().trim());
      

      输出:

      Welcome to fancy! A text based rpg. Perhaps you could tell us your name brave
      adventurer?
      foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar-foo-bar
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-09
        • 2011-11-03
        • 2020-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        相关资源
        最近更新 更多