【问题标题】:How to split a string after every 10 words?如何在每 10 个单词后拆分一个字符串?
【发布时间】:2019-12-08 19:21:16
【问题描述】:

我正在寻找一种方法,以每 10 个单词拆分我的字符串块。 我正在使用以下代码。

我的输入将是一个长字符串。
例如:这是一个示例文件,可用作该程序的参考,我希望这一行每 10 个单词分割(换行)。

private void jButton27ActionPerformed(java.awt.event.ActionEvent evt) {                                          

    String[] names = jTextArea13.getText().split("\\n");

           var S = names.Split().ToList();
           for (int k = 0; k < S.Count; k++) {
               nam.add(S[k]);
               if ((k%10)==0) { 
                   nam.add("\r\n");       
               }
           }

           jTextArea14.setText(nam);


output:
this is an example file that can be used as
a reference for this program, i want this line to
be split (newline) by every 10 words each.

感谢任何帮助。

【问题讨论】:

标签: java string string-matching


【解决方案1】:

我正在寻找一种方法,将字符串每 10 个单词拆分一次

带有非捕获组的正则表达式是实现这一目标的更简洁的方法:

str = str.replaceAll("((?:[^\\s]*\\s){9}[^\\s]*)\\s", "$1\n");

上例中的9 就是words-1,因此如果您希望它每隔20 个单词拆分一次,请将其更改为19

这意味着你的代码可能变成:

jTextArea14.setText(jTextArea13.getText().replaceAll("((?:[^\\s]*\\s){9}[^\\s]*)\\s", "$1\n"));

对我来说,这更具可读性。当然,在您的情况下它是否更具可读性取决于您的代码库的用户是否相当精通正则表达式。

【讨论】:

  • 这里最好使用正则表达式。
  • 做得很好...如果我将其拆分为 20 而不是 10?
  • 为了使其对多个连续的空格具有鲁棒性,您可以使用 + 进行量化,从而使正则表达式 "((?:\\S+\\s+){9}\\S+)\\s+"
【解决方案2】:

你也可以利用 java util 试试这个

public static final String WHITESPACE = " ";
public static final String LINEBREAK = System.getProperty("line.separator");


 public static String splitString(String text, int wordsPerLine)
  {
    final StringBuilder newText = new StringBuilder();

    final StringTokenizer wordTokenizer = new StringTokenizer(text);
    long wordCount = 1;
    while (wordTokenizer.hasMoreTokens())
    {
        newText.append(wordTokenizer.nextToken());
        if (wordTokenizer.hasMoreTokens())
        {
            if (wordCount++ % wordsPerLine == 0)
            {
                newText.append(LINEBREAK);
            }
            else
            {
                newText.append(WHITESPACE);
            }
        }
    }
    return newText.toString();
   }

【讨论】:

    【解决方案3】:

    你是如此接近。

    在将拆分词设置回文本框之前,您没有附加拆分词。 StringBuilder sb.append(S[k]) 会将您的拆分名称添加到缓冲区。 sb.append(" ") 然后会添加一个空格。每行将有 10 个空格分隔的名称。

    StringBuilder sb = new StringBuilder();
    String[] names = jTextArea13.getText().split(" ");
    
    
    for (int k = 0; k < S.length; k++) {
    
       sb.append(S[k]).append(" ");
       if (((k+1)%10)==0) { 
          sb.append("\r\n");       
       }
    }
    

    最后打印回你的 jTextArea 使用:

    jTextArea14.setText(sb.toString());
    

    顺便说一句,由于 sb 是 StringBuilder,你需要使用 toString 网络将其更改为字符串。

    【讨论】:

    • 给出一些解释。 . . . ... . . . . .
    • 这不太对。如果您附加该值并 then 像您在此处所做的那样检查可除性 10,那么您将始终将第一个单词单独打印在一行上,然后将其余单词拆分为10 之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    相关资源
    最近更新 更多