3

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

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

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

提前致谢。

4

5 回答 5

3

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

于 2012-05-24T10:34:03.970 回答
3

这应该适用于所有输入,除非有不超过 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);
  }
于 2012-05-24T10:37:39.317 回答
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());
于 2012-05-24T10:41:30.180 回答
3

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

    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(,|$)");
于 2012-05-24T10:48:09.897 回答
2

如果您有一个如上面显示的简单文本(由空格分隔的单词),您总是可以想到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());
                }
            }
        }

    }
于 2012-05-24T10:46:24.847 回答