Java 使用模式匹配在多字符分隔符上拆分行

Java 使用模式匹配在多字符分隔符上拆分行,java,regex,Java,Regex,我正在运行以下简单程序: 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 = "

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

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
它是如何工作的?

将丢弃所有尾随的空令牌

该方法的工作原理类似于使用给定表达式和零限制参数调用双参数split方法。因此,结果数组中不包括尾随的空字符串

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

若要获取
12
,必须使用具有负限制(或限制至少为
12
)的,该限制不会丢弃尾随的空令牌

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

将丢弃所有尾随的空令牌

该方法的工作原理类似于使用给定表达式和零限制参数调用双参数split方法。因此,结果数组中不包括尾随的空字符串

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

若要获取
12
,必须使用具有负限制(或限制至少为
12
)的,该限制不会丢弃尾随的空令牌

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

来自(我的)

该方法的工作原理类似于使用给定的输入序列和零的极限参数调用双参数split方法因此,结果数组中不包括尾随空字符串

换句话说,拆分
“xyz | ~xyz | ~xyz | ~xyz | ~xyz | ~~~~~~~~~~~~~”
上的将在开始时生成数组

["xyz","xyz","xyz","xyz","xyz","","","","","","",""]
但由于内部调用的方法中的
limit
参数被设置为
0
尾部的空字符串被删除,这意味着您得到的结果数组被删除

["xyz","xyz","xyz","xyz","xyz"]
长度是5

基于这些方法的文档,如果要避免删除尾随的空字符串,可以将此方法与负值
limit
值一起使用,如

String[] tokensInvalid = pattern.split(invalid, -1);
//                                              ^^^
来自(我的)

该方法的工作原理类似于使用给定的输入序列和零的极限参数调用双参数split方法因此,结果数组中不包括尾随空字符串

换句话说,拆分
“xyz | ~xyz | ~xyz | ~xyz | ~xyz | ~~~~~~~~~~~~~”
上的将在开始时生成数组

["xyz","xyz","xyz","xyz","xyz","","","","","","",""]
但由于内部调用的方法中的
limit
参数被设置为
0
尾部的空字符串被删除,这意味着您得到的结果数组被删除

["xyz","xyz","xyz","xyz","xyz"]
长度是5

基于这些方法的文档,如果要避免删除尾随的空字符串,可以将此方法与负值
limit
值一起使用,如

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