2014-09-24 65 views
1

我运行下面的程序:拆分在多字符行分隔符使用模式匹配

public class TestClass { 
    public static void main(final String[] args) { 
     String valid = "abc|~abc|~abc|~abc|~abc|~|~|~|~|~|~|~abc"; 
     String invalid = "xyz|~xyz|~xyz|~xyz|~xyz|~|~|~|~|~|~|~"; 
     String delimiter = "|~"; 
     Pattern pattern = Pattern.compile(Pattern.quote(delimiter)); 
     String[] tokensValid = pattern.split(valid); 
     String[] tokensInvalid = pattern.split(invalid); 
     System.out.println("Valid: " + tokensValid.length); 
     System.out.println("InValid: " + tokensInvalid.length); 
    } 
} 

输出是:

Valid: 12 
InValid: 5 

但我感觉输出应该是:

Valid: 12 
InValid: 12 

它是如何工作的?

回答

3

one-arg overload of String.split将丢弃所有空的尾随空令牌。

该方法的工作原理与通过调用给定表达式和极限参数为零的双参数拆分方法相同。尾随的空字符串因此不包含在结果数组中。

你有7个。这就是为什么你的“InValid”案件得到5

要获得12,您必须使用two-arg overload of String.split,并使用负数限制(或至少为12的限制),它不会丢弃尾随的空标记。

限参数控制的被施加图案的次数,并因此影响所得阵列的长度。如果极限值n大于零,那么模式将最多应用n-1次,数组的长度不会大于n,并且数组的最后一项将包含超出最后匹配分隔符的所有输入。如果n是非正值,那么该模式将尽可能多地应用,并且该数组可以具有任何长度。如果n为零,则模式将尽可能多次应用,数组可以有任意长度,并且尾随的空字符串将被丢弃。

1

split method documentation从(重点煤矿)

此方法类似于调用两个参数分割方法用给定的输入序列和零限制参数。 因此尾随的空字符串不包含在结果数组中。

换句话说分割"xyz|~xyz|~xyz|~xyz|~xyz|~|~|~|~|~|~|~"|~将在开始产生阵列

["xyz","xyz","xyz","xyz","xyz","","","","","","",""] 

但因为limit参数调用内部split(CharSequence input, int limit)方法设置为0尾随空字符串洁具去除,这意味着结果数组你有是

["xyz","xyz","xyz","xyz","xyz"] 

这是长度5.

基于这些方法的文档

,如果你想避免删除后空字符串,你可以使用此方法负limit值一样

String[] tokensInvalid = pattern.split(invalid, -1); 
//            ^^^ 
相关问题