点上的String.split无法按预期工作

时间:2014-05-14 23:16:49

标签: java string stringbuilder

我有一个字符串= 12.05.2014

我正在尝试使用拆分"。"但由于某种原因它返回空数组。

System.out.println(newDate);
System.out.println(newDate.length());
String [] dateCells = newDate.split(".");

StringBuilder sBuilder = new StringBuilder();
sBuilder.append(dateCells[2]).append(dateCells[0]).append(dateCells[1]);
System.out.println(sBuilder.toString());

输出结果为:

12.05.2014
10
            //empty line

3 个答案:

答案 0 :(得分:5)

split使用正则表达式,正则表达式.表示"行分隔符旁边的任何字符"。

所以你在每个角色上分裂,创建充满空元素的数组,如

"foo".split(".")

首先会创建["","","",""],但由于split也会跟踪位于数组末尾的空元素,因此您将获得空数组[]。通过将负值传递为split(regex,limit),可以使用重载版本的分割limit关闭最后一个空字符串。

要解决此问题,您需要转义.。为此,您可以使用例如

  • split("\\.") - 正则表达式中的标准转义
  • split("[.]") - 使用character class
  • 转义
  • split("\\Q.\\E") - \Q\E标记区域,其中正则表达式元字符应被视为简单文字
  • split(Pattern.quote(".")) - 此方法在正则表达式编译器中使用Pattern.LITERAL标志指出正则表达式中使用的元字符是简单文字,没有任何特殊含义

另一个问题是for循环中的情况,但Jeroens answer中有更多问题。

答案 1 :(得分:4)

你的条件是

for(int i = dateCells.length; i < 0; i--){

3开始运行,而您的计数器小于0。从来没有。

明显的解决方案:使用i > 0或将其更改为从0循环到3

此外:不要忘记逃避点是一个特殊的正则表达式字符。转义是通过反斜杠(\)完成的,但由于该反斜杠也是一个特殊字符,因此您也必须将其转义。

最终结果:

.split("\\.")

答案 2 :(得分:1)

此外,您需要在分割时转义{​​{1}},因为.会将String.split()视为正则表达式。

.