5

我有两个正则表达式:

[a-c] : any character from a-c

[a-z] : any character from a-z

和一个测试:

public static void main(String[] args) {
    String s = "abcde";
    String[] arr1 = s.split("[a-c]");
    String[] arr2 = s.split("[a-z]");

    System.out.println(arr1.length); //prints 4 : "", "", "", "de"
    System.out.println(arr2.length); //prints 0 
}

为什么第二次分裂会这样?我希望得到一个带有 6 个空字符串 "" 结果的结果。

4

3 回答 3

9

根据单参数的文档String.split

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

要保留尾随字符串,您可以使用两个参数版本,并指定负限制:

    String s = "abcde";
    String[] arr1 = s.split("[a-c]", -1); // ["", "", "", "de"]
    String[] arr2 = s.split("[a-z]", -1); // ["", "", "", "", "", ""]
于 2013-07-19T19:55:11.203 回答
5

默认情况下,split丢弃尾随的空字符串。在这种arr2情况下,它们都是尾随的空字符串,所以它们都被丢弃了。

要获得 6 个空字符串,请将负限制作为第二个参数传递给split方法,这将保留所有尾随空字符串。

String[] arr2 = s.split("[a-z]", -1);

如果 n 为非正数,则该模式将尽可能多地应用,并且数组可以具有任意长度。

于 2013-07-19T19:55:05.367 回答
0

String.split()

围绕给定正则表达式的匹配拆分此字符串。

周围意味着匹配本身被删除。例如,用逗号分隔 "a,b,c"与anda一样。bc

第一次拆分删除了 a、b 和 c。

第二个删除所有字母,从而删除该字符串中的所有字符。

于 2013-07-19T19:55:28.943 回答