【问题标题】:Java - How would I split a string into multiple lines depending on an input?Java - 如何根据输入将字符串拆分为多行?
【发布时间】:2021-03-08 03:38:42
【问题描述】:

我是 Java 新手,想根据输入的最大长度将用户输入的消息拆分为多行。我将如何重复它?这是我目前所拥有的:

int rem = m - maxlength;
System.out.println(message.substring(0, message.length() - rem));
System.out.println(message.substring(message.length() - rem)); 

【问题讨论】:

  • 您能否添加一些示例数据,以帮助解释您在此处尝试实现的目标。
  • 你可以用正则表达式来做到这一点,虽然实际的正则表达式有点复杂,但我需要一点时间来解决。
  • 使用 BreakIterator 类为多种语言处理此问题。

标签: java string split


【解决方案1】:

正则表达式版本(最简单):

String text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.";
int lineMaxLength = 10;
System.out.println(java.util.Arrays.toString(
    text.split("(?<=\\G.{"+lineMaxLength+"})")
));

哪些打印:

[Lorem Ipsu, m is simpl, y dummy te, xt of the , printing a, nd typeset, ting indus, try. Lorem,  Ipsum has,  been the , industry's,  standard , dummy text,  ever sinc, e the 1500, s, when an,  unknown p, rinter too, k a galley,  of type a, nd scrambl, ed it to m, ake a type,  specimen , book.]

没有正则表达式:

import java.util.List;
import java.util.ArrayList;

public class MyClass {
    public static void main(String args[]) {
      String text = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.";
      int lineMaxLength = 10;
      List<String> lines = new ArrayList<>();
      int length = text.length();
      StringBuilder s = new StringBuilder();
      for(int i = 0; i < length; i++){
          if (i % lineMaxLength == 0){
              if(i != 0){
                  lines.add(s.toString());
              }
              s = new StringBuilder();
          }
          s.append(text.charAt(i));
      }
  int linesLength = lines.size();
  for(int i= 0; i < linesLength; i++){
      System.out.println(lines.get(i));
  }
    }
}

哪些打印:

Lorem Ipsu
m is simpl
y dummy te
xt of the 
printing a
nd typeset
ting indus
try. Lorem
 Ipsum has
 been the 
industry's
 standard 
dummy text
 ever sinc
e the 1500
s, when an
 unknown p
rinter too
k a galley
 of type a
nd scrambl
ed it to m
ake a type
 specimen 

【讨论】:

    【解决方案2】:

    这类作品。我选择了一个非常短的 10 个字符的“行”长度,您可能应该增加它。但它展示了如何在没有太多代码的情况下做到这一点。将正则表达式中的“10”更改为不同的数字以增加行长。

    (我稍微改了一下代码,更明显的是这个方法不会在中间分割单词,而是总是在空格处分割。)

       public static void main( String[] args ) {
          String s = "This is a test. This is a test. This is a test. This is a test. This is a test. This is a test.  ";
          String regex = ".{1,10}\\s";
          Matcher m = Pattern.compile( regex ).matcher( s );
          ArrayList<String> lines = new ArrayList<>();
          while( m.find()  ) {
             lines.add(  m.group() );
          }
          System.out.println( String.join( "\n", lines ) );
       }
    

    运行:

    This is a 
    test. This 
    is a test. 
    This is a 
    test. This 
    is a test. 
    This is a 
    test. This 
    is a test. 
    BUILD SUCCESSFUL (total time: 0 seconds)
    
           
    

    【讨论】:

    • BreakIterator 类是区域敏感的。
    【解决方案3】:

    像这样使用 WordIterator。 BreakIterator 类对语言环境敏感。您可以使用不同的语言。

    public static void main(String[] args) {
        String msg = "This is a long message. Message is too long. Long is the message";
        int widthLimit = 15;
        printWithLimitedWidth(msg, widthLimit);
    }
    
    static void printWithLimitedWidth(String s, int limit) {
        BreakIterator br = BreakIterator.getWordInstance(); //you can get locale specific instance to handle different languages.
        br.setText(s);
        int currLenght = 0;
        int start = br.first();
        int end = br.next();
    
        while (end != BreakIterator.DONE) {
           String word = s.substring(start,end);
           currLenght += word.length(); 
           if (currLenght <= limit) {
              System.out.print(word);
           } else {
               currLenght = 0;
               System.out.print("\n"+word);
           }
           start = end;
           end = br.next();
        }
    }
    

    输出:

    This is a long 
    message. Message is 
    too long. Long is 
    the message
    

    这是一个示例代码。根据您的需要处理空格和其他特殊字符。 更多信息请参考https://docs.oracle.com/javase/tutorial/i18n/text/about.html

    【讨论】:

      【解决方案4】:
      int maxlength = 10;
      String message = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      String transformedMessage = message.replaceAll("(?<=\\G.{" + maxlength + "})", "\n");
      System.out.println(transformedMessage);
      /*Output
      1234567890
      ABCDEFGHIJ
      KLMNOPQRST
      UVWXYZ
      */
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-09
        • 2015-12-19
        • 1970-01-01
        • 2010-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多