为什么“||”。split(“\\ |”)。长度返回0而不是3?

时间:2012-07-17 01:11:50

标签: java regex split apex-code

当拆分表达式中存在相邻的分隔符时,我期望null或空字符串 - 不会消除它。

Java代码如下:

public class splitter {
    public static void main(String args[]) {
        int size = "||".split("\\|").length;
        assert size == 3 : "size should be 3 and not " + size;
    }
}

我希望得到{“”,“”,“”}或{null,null,null}。要么没事。

也许有一个不会被空话愚弄的正则表达式?

2 个答案:

答案 0 :(得分:14)

根据javadoc

  

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

split(String, int)的javadoc阐述:

  

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

(强调我的)

因此,要返回空字符串数组,请调用"||".split("\\|", -1)

答案 1 :(得分:0)

我需要仔细看看Paul的答案(他看起来更简单),但我能够找到一些解决断言的前瞻表达式(我道歉代码在Apex中 - 它只是包装Java )。

static testMethod void testPatternStringSplit() {
        Pattern aPattern = Pattern.Compile('(?=\\|)');
        system.assertEquals(3, aPattern.split('||').size());
        system.assertEquals(3, aPattern.split(' | | ').size());
        system.assertEquals(3, aPattern.split('a|b|c').size());
        system.assertEquals(3, aPattern.split('a|b|').size());
        system.assertEquals(3, aPattern.split('|b|c').size());
        system.assertEquals(3, aPattern.split('|b|').size());
}

我需要编写一些代码来测试Paul的......