为什么java 根据“|”分割字符串需要使用“\\|” 双反斜杠做特殊处理

        在java开发中,常常需要将字符串分隔成字符串数组,再进行操作,比如String str = "aa|bb|cc|||",我们原意是想调用str .split("|")将它根据"|"分隔,预想会分成"aa","bb","cc","","",""6个子串。但实际结果如下:为什么java 根据“|”分割字符串需要使用“\\|” 双反斜杠做特殊处理

为什么呢,我们看下jdk原码,String.split的参数是一个正则表达式,而在正则表达式中,| 表示或的意思,它表示匹配左边或右边的内容。而"|"的意思自然就是匹配空了,所以原字符串会被分隔成一个一个的字符。

为什么java 根据“|”分割字符串需要使用“\\|” 双反斜杠做特殊处理

 

 

所以呢,我们需要将|转义,即 以String bArr[] = str.split("\\|");这种形式分隔,但是问题又出现了,预期6个子串,实际得到了3个

为什么java 根据“|”分割字符串需要使用“\\|” 双反斜杠做特殊处理

再看原码

public String[] split(String regex) {
    return split(regex, 0);
},它实际调用了两参的split方法,而第二个参数说明如下:

为什么java 根据“|”分割字符串需要使用“\\|” 双反斜杠做特殊处理

就是说第二个参数默认为0,原字符串后面被切割成空串的部分都会被丢弃,当此参数为正数时,最多切割不超过此正数次,为负数时则全部切割,所以如果我们的字符串如果预想切割成6个子串,可以使用以下写法:

String bArr[] = str.split("\\|", -1);