7

当拆分表达式中有相邻的分隔符时,我期望 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 }。两者都可以。

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

4

2 回答 2

14

根据javadoc

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

用于详细说明的 javadoc split(String, int)

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

(强调我的)

所以要返回一个空字符串数组,调用"||".split("\\|", -1)

于 2012-07-17T01:26:20.113 回答
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 的...

于 2012-07-17T02:03:35.550 回答