分隔符拆分并没有给出正确的答案

时间:2014-12-03 13:18:19

标签: java

我试图通过java中的.split()方法拆分字符串。当我尝试将字符串拆分为

     2000##Test

它给了我一个包含;

的数组
     2000,,Test

但是当我试图分裂这样的东西时;

    ####

它什么都没给我。我想要的是

    ,,,,

编辑:我的分隔符是#

我怎样才能做到这一点。

美好的一天。

我的java代码是:

  String splitString = "2000##1000####";
  List<String> splitList = new ArrayList<String>();
  String[] splitValues = text.split(splitString,"#");
  for ( int i = 0;i< splitValues.length;i++){
      splitList.add(splitValues[i]);
  }

4 个答案:

答案 0 :(得分:1)

这是一个已知且有记录的问题/行为。 String.split() silently discards trailing separators.

split()的JavaDocs(强调我的):

  

此方法的工作方式就像通过调用双参数split方法一样   给定的表达式和一个零的限制参数。 尾随空   因此,字符串不包含在结果数组中。


目前最简单的方法和首选分割机制是使用Google Guava&#39; Splitter

String input = "####";
System.out.println(Splitter.on('#').split(input));

输出:

[, , , , ]

此外,它避免了创建基础数组时所有结果,因为它懒得分裂。除了其他优点外,这对内存要求较低。

您的代码显示您要从结果数组中生成List。这也很容易实现:

List<String> splitInput = Splitter.on('#').splitToList(input);

您也可以使用Apache Commons Lang's StringUtils.splitPreserveAllTokens()

StringUtils.splitPreserveAllTokens(input, '#');

还输出[, , , , ]

答案 1 :(得分:1)

您期待的works

String string = "####";
String[] parts = string.split("#",-1);
System.out.println(Arrays.toString(parts));

提供[, , , ,]

文档说&#34;因此,结果数组中不包括尾随空字符串。&#34;。 split()方法采用limit参数,该参数描述为here

  

limit参数控制模式的次数   应用因此会影响结果数组的长度。如果是   如果是非正数,那么模式将被应用多次   可能,阵列可以有任何长度。如果n为零,那么   模式将尽可能多地应用,数组可以有   任何长度,尾随空字符串都将被丢弃。

答案 2 :(得分:1)

如果使用overload of split that takes an int parameter并传递负值,则不会从结果数组中删除尾随空白项:

String[] splitValues = splitString.split("#", -1);

Demo.

这会生成{"2000", "", "1000", "", "", "", ""}数组。

答案 3 :(得分:0)

只是对此的补充,我意识到这不是你问的问题,但看起来你也想把你的分裂数组转换成一个列表,而不是你有的for循环

String splitString = "####";
List<String> splitList = Arrays.asList(splitString.split("#",-1));