代码之家  ›  专栏  ›  技术社区  ›  tggagne

为什么“||”.split(“\\|”).length返回0而不是3?

  •  7
  • tggagne  · 技术社区  · 13 年前

    当拆分表达式中有相邻的分隔符时,我希望为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 回复  |  直到 13 年前
        1
  •  14
  •   Paul Bellora    13 年前

    根据 javadoc 以下为:

    这个方法的工作原理就好像通过调用两个参数 split 方法,该方法具有给定的表达式和零的极限参数。 因此,尾随的空字符串不包括在结果数组中。

    的javadoc split(String, int) 阐述:

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

    (强调矿井)

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

        2
  •  0
  •   tggagne    13 年前

    我需要仔细研究一下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的。。。