String.split()意外返回“”

时间:2013-05-06 15:38:30

标签: java regex string

我有一个将字符串拆分成数组的简单方法。它将它分成有非字母字符的地方。我现在使用的这一行如下:

String[] words = str.split("[^a-zA-Z]");

所以这应该将字符串拆分为只有字母字符的地方。但问题是,当它分裂时,它适用于某些,但不是全部。例如:

String str = "!!day--yaz!!";
String[] words = str.split("[^a-zA-Z]");
String result = "";

for (int i = 0; i < words.length; i++) {
    result += words[i] + "1 ";
}

return result;

我在那里添加了1以查看拆分发生的位置,因为我在空值上遇到错误。无论如何,当我运行这段代码时,我得到一个输出:

1 1 day1 1 yaz1

为什么它会在前两个之间分开,然后在最后两个之后分开,而不是在最后两个之后!为什么它甚至在那里分裂?对此的任何帮助都会很棒!

3 个答案:

答案 0 :(得分:5)

在分割匹配之前或之后它没有分裂,因此你会在破折号和刘海之间得到一个空字符串。

这不适用于尾随刘海,因为javadoc

中描述的尾随空字符串被省略
  

因此,结果中不包括尾随空字符串   阵列。

答案 1 :(得分:3)

这是因为它确实使用每个非字母字符作为分隔符。这意味着字符串"!"将被拆分为感叹号左侧和右侧的2个空字符串数组。

您的问题可以通过两个步骤解决。

  1. 使用"[^a-zA-Z]+"代替"[^a-zA-Z]"+将帮助您避免2个短划线之间的空字符串。
  2. 在拆分前删除起始和尾随非字母字符。这将删除前导和尾随空字符串:str.replaceFirst("[^a-zA-Z]+").replaceFirst("[^a-zA-Z]+$")
  3. 最后你的拆分看起来像是:

    String[] words = str..replaceFirst("[^a-zA-Z]+").replaceFirst("[^a-zA-Z]+$")split("[^a-zA-Z]");

答案 2 :(得分:1)

如果您想摆脱一些额外的拆分,请使用split("[^a-zA-Z]+")代替split("[^a-zA-Z]")。这将匹配与模式匹配的String的连续部分。