我正在运行以下简单程序:

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


它是如何工作的?

最佳答案

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


  该方法的工作方式就像通过调用具有给定表达式且限制参数为零的二参数拆分方法。因此,结尾的空字符串不包括在结果数组中。


你有7个。这就是为什么您的“无效”案例得到5的原因。

要获取12,必须使用带有负限制(或至少为String.split的限制)的two-arg overload of 12,该限制不会丢弃尾随的空令牌。


  limit参数控制应用图案的次数,因此会影响所得数组的长度。如果限制n大于零,则将最多应用n-1次该模式,该数组的长度将不大于n,并且该数组的最后一个条目将包含除最后一个匹配的定界符之外的所有输入。如果n为非正数,则该模式将被尽可能多地应用,并且数组可以具有任何长度。如果n为零,则该模式将被尽可能多地应用,该数组可以具有任何长度,并且尾随的空字符串将被丢弃。

10-07 19:08
查看更多