2013-07-19 80 views
5

我有两个regexpressions:分割字符串在Java中使用[A-Z]正则表达式

[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个空字符串“”结果的reslut。

回答

9

根据the documentation of the single-argument String.split

此方法仿佛通过与给定表达式和为零的限制参数调用两个参数split方法。尾随的空字符串因此不包含在结果数组中。

为了保持尾随字符串,可以使用两个参数的版本,并指定一个负极限:

String s = "abcde"; 
    String[] arr1 = s.split("[a-c]", -1); // ["", "", "", "de"] 
    String[] arr2 = s.split("[a-z]", -1); // ["", "", "", "", "", ""] 
+0

我没有注意到文档中描述的尾部行为,谢谢 – geo

5

缺省情况下,split丢弃尾随的空字符串。在arr2的情况下,他们都是尾随空的字符串,所以他们都被丢弃。

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

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

如果n是非正则模式将被多次施加 可能的,并且阵列可以具有任意长度。

+0

感谢你的第一句话说明了这一切 – geo

0

String.split()

拆分此字符串周围的给定的比赛正则表达式。

环绕表示游戏本身已被删除。例如,在逗号分割“a,b,c”将只​​是a以及bc

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

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

+0

我相信你误解了这个问题:你的回答是正确的,但不涉及。 – ruakh

+0

@ruakh“为什么第二次分裂的行为像这样?”现在编辑。 – hexafraction

相关问题