【问题标题】:How to Split a string in java based on limit如何根据限制在java中拆分字符串
【发布时间】:2012-05-24 10:25:28
【问题描述】:

我有以下字符串,当它的长度达到 36 时,我想将此字符串拆分为多个子字符串(通过以“,”作为分隔符)。它不完全拆分在第 36 个位置

      String message = "This is some(sampletext), and has to be splited properly";

我想得到如下两个子字符串的输出:
1. '这是一些(示例文本)'
2. '并且必须正确分割'

提前致谢。

【问题讨论】:

  • 由空格分割然后根据长度限制连接。
  • Java 中没有 API 可以做到这一点,所以你必须想出一个算法。你试过了吗?你遇到了什么问题?
  • 您希望“句子中的长单词”的输出是什么?
  • 最后一个拆分不是不必要的吗,即输出不应该是'This is some' , 'sample text and' , 'has to be', 'splited properly'

标签: java string string-split


【解决方案1】:

基于正则表达式的解决方案:

    String s = "This is some sample text and has to be splited properly";
    Pattern splitPattern = Pattern.compile(".{1,15}\\b");
    Matcher m = splitPattern.matcher(s);
    List<String> stringList = new ArrayList<String>();
    while (m.find()) {
        stringList.add(m.group(0).trim());
    }

更新: 可以通过将模式更改为以空格结尾或字符串结尾来删除 trim():

    String s = "This is some sample text and has to be splited properly";
    Pattern splitPattern = Pattern.compile("(.{1,15})\\b( |$)");
    Matcher m = splitPattern.matcher(s);
    List<String> stringList = new ArrayList<String>();
    while (m.find()) {
        stringList.add(m.group(1));
    }

group(1) 表示我只需要模式的第一部分 (.{1,15}) 作为输出。

.{1,15} - 长度在 1 到 15 之间的任意字符 (".") 序列 ({1,15})

\b - 分词(任何单词之前或之后的非字符)

(|$) - 空格或字符串结尾

此外,我在 .{1,15} 周围添加了 (),因此我可以将它作为一个整体使用 (m.group(1))。 根据所需的结果,可以调整此表达式。

更新: 如果您只想在消息长度超过 36 的情况下用逗号分割消息,请尝试以下表达式:

Pattern splitPattern = Pattern.compile("(.{1,36})\\b(,|$)");

【讨论】:

  • 这个解决方案没有正确处理句尾(它在最后两个词之间引入了多余的分割)。
  • 实际上,它确实按照 OP 要求的方式拆分了句子。虽然我仍然认为最后一次拆分是不必要的。
  • @eljenso 最后的拆分可以通过使用 Pattern.compile(".{1,16}\\b") 来避免,但我放了 1,15,因为它符合要求。
  • 是的,很好。尽管如此,我很惊讶,除了我自己认为也有效的答案(但请随时纠正我),这是唯一的其他“严肃”答案。
  • @tibtof,再次感谢您的回答。你能解释一下这个 (".{1,15}\\b") 表达式到底是做什么的吗?
【解决方案2】:

我能想到的最佳解决方案是创建一个遍历字符串的函数。在该函数中,您可以跟踪空白字符,并且对于每个第 16 个位置,您可以根据最后遇到的空白的位置将子字符串添加到列表中。在它找到一个子字符串后,您从最后遇到的空格重新开始。然后您只需返回子字符串列表。

【讨论】:

    【解决方案3】:

    这是一个整洁的答案:

    String message = "This is some sample text and has to be splited properly";
    
    String[] temp = message.split("(?<=^.{1,16}) ");
    String part1 = message.substring(0, message.length() - temp[temp.length - 1].length() - 1);
    String part2 = message.substring(message.length() - temp[temp.length - 1].length());
    

    【讨论】:

    • 你能解释一下它是如何工作的吗?我从未见过这样的拆分功能!
    • 这在空字符串上崩溃,不适用于小于 16 的字符串,并且缺少递归步骤。
    • @eljenso 防止错误输入所需的(明显)代码已(显然)省略,只留下对答案很重要的代码,这对于 stackoverflow 答案来说是很正常的。
    • 小于 16 的字符串(显然)不是“错误输入”。此外,这里有趣的部分是递归步骤,由于某些(非显而易见的)原因而将其省略。魔鬼——当然是正则表达式——在细节中(参见tibtof's answer)。只是向 OP 扔一个正则表达式不会帮助他。所以我不同意这只是“对答案很重要的代码”。
    【解决方案4】:

    这应该适用于所有输入,除非有不超过 16 个空格的字符序列。它还通过索引到原始字符串来创建最少数量的额外字符串。

      public static void main(String[] args) throws IOException
      {
        String message = "This is some sample text and has to be splited properly";
        List<String> result = new ArrayList<String>();
        int start = 0;
        while (start + 16 < message.length())
        {
          int end = start + 16;
          while (!Character.isWhitespace(message.charAt(end--)));
          result.add(message.substring(start, end + 1));
          start = end + 2;
        }
        result.add(message.substring(start));
        System.out.println(result);
      }
    

    【讨论】:

      【解决方案5】:

      如果您有一个如上面所示的简单文本(由空格分隔的单词),您总是可以想到StringTokenizer。以下是一些适用于您的案例的简单代码:

      public static void main(String[] args) {
      
              String message = "This is some sample text and has to be splited properly";
              while (message.length() > 0) {
                  String token = "";
                  StringTokenizer st = new StringTokenizer(message);
                  while (st.hasMoreTokens()) {
                      String nt = st.nextToken();
                      String foo = "";
                      if (token.length()==0) {
                          foo = nt;
                      }
                      else {
                          foo = token + " " + nt;
                      }
                      if (foo.length() < 16)
                          token = foo;
                      else {
                          System.out.print("'" + token + "' ");
                          message = message.substring(token.length() + 1, message.length());
                          break;
                      }
                      if (!st.hasMoreTokens()) {
                          System.out.print("'" + token + "' ");
                          message = message.substring(token.length(), message.length());
                      }
                  }
              }
      
          }
      

      【讨论】:

      • 不。除其他问题外,最后一个词已从结果中删除。
      • 你说得对,我写的代码很快,却漏掉了最后一个字……现在它可以正常工作了!我真正想向您展示的是 StringTokenizer 类,它在使用字符串时非常有用。
      猜你喜欢
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 2014-02-19
      • 2013-12-17
      相关资源
      最近更新 更多