1

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

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 以查看拆分发生的位置,因为我在 null 值上遇到错误。无论如何,当我运行此代码时,我会得到以下输出:

1 1 day1 1 yaz1

为什么它在前两个 !'s 和其中一个 -'s 之后分裂,而不是在最后两个 !'s 之后分裂?为什么它甚至在那里分裂?对此的任何帮助都会很棒!

4

3 回答 3

5

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

这不适用于尾随刘海,因为如javadoc中所述,尾随空字符串被省略

因此,尾随的空字符串不包含在结果数组中。

于 2013-05-06T15:46:08.130 回答
3

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

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

  1. 使用"[^a-zA-Z]+"而不是"[^a-zA-Z]". 这+将帮助您避免两个破折号之间的空字符串。
  2. 拆分前删除开头和结尾的非字母字符。这将删除前导和尾随空字符串:str.replaceFirst("[^a-zA-Z]+").replaceFirst("[^a-zA-Z]+$")

最后,您的拆分将如下所示:

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

于 2013-05-06T15:45:30.813 回答
1

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

于 2013-05-06T15:44:21.250 回答