在使用java中的split按照“\t”,拆分字符串的时候,发现如果最后的几个字段是空,只是用\t分割,是连着的\t的话,就不会被分割,如 “d\tc\te\t\t\t”最后的几个\t就不会被分割,应该是在拆分之前对字符串进行了处理。导致的拆分字段个数错误。
查了一下APi,需要在split中添加参数-1,String[] values = line.split("\t",-1);
imit 参数控制应用模式的次数,从而影响结果数组的长度
如果限制 n 大于零,那么模式至多应用 n> - 1 次,数组的长度不大于 n,并且数组的最后条目将包含除最后的匹配定界符之外的所有输入
如果 n 非正,那么将应用模式的次数不受限制,并且数组可以为任意长度
如果 n 为零,那么应用模式的次数不受限制,数组可以为任意长度,并且将丢弃尾部空字符串 (就是这个原因)
添加上参数-1之后,就正常了。
---------------------
看了下jdk里String类的public String[] split(String regex,int limit)方法,
感觉平时不太会用这方法,以为在用正则表达式来拆分时候,如果匹配到的字符是最后一个字符时,会拆分出两个空字符串,
例如"o"split("o",5) or "o"split("o",-2)时候 结果是"" "" 也就是下图中红框里的内容,所以平时一般都用split(String regex) 方法,
其实也就等同于split(String regex,0)方法,把结尾的空字符串丢弃!
package com.vivo.javatool;
import org.apache.commons.lang3.StringUtils;
import java.util.Arrays;
/**
* @author WU JIAN HUA
* @date 2019/4/26
* @since 2.0
* description: java字符串split有很多坑,使用时请小心!
*/
public class TestSplit {
//https://blog.csdn.net/u014481096/article/details/51451153
public static void main(String[] args) {
System.out.println(":ab:cd:ef::".split(":").length);//末尾分隔符全部忽略
System.out.println(":ab:cd:ef::".split(":",-1).length);//不忽略任何一个分隔符
System.out.println(StringUtils.split(":ab:cd:ef::",":").length);//最前面的和末尾的分隔符全部都忽略,apache commons
System.out.println(StringUtils.splitPreserveAllTokens(":ab:cd:ef::",":").length);//不忽略任何一个分隔符 apache commons
String test001="2;北京鸿元知识产权代理有限公司;检索费;2100;0;6.294455;PCT/CN2012/077798;25852024;20120904;;";
System.out.println(Arrays.toString(test001.split(";")));
System.out.println(Arrays.toString(test001.split(";",-1)));
//split正则表达式+结果阀值2,否则value为base64编码的数据的话其中==会丢失,如appVersion=31105==&imei=865407010000009==
String nextLine="imei=865407010000009==";
System.out.println(Arrays.toString(nextLine.split("=")));
System.out.println(Arrays.toString(nextLine.split("=",-1)));
System.out.println(Arrays.toString(nextLine.split("=",2)));
/**
结果
4
6
3
6
[2, 北京鸿元知识产权代理有限公司, 检索费, 2100, 0, 6.294455, PCT/CN2012/077798, 25852024, 20120904]
[2, 北京鸿元知识产权代理有限公司, 检索费, 2100, 0, 6.294455, PCT/CN2012/077798, 25852024, 20120904, , ]
[imei, 865407010000009]
[imei, 865407010000009, , ]
[imei, 865407010000009==]
*/
}
}