Java中String.split()分割长度问题

一、前言:

通常在mr中需要处理很多的字符串数据,其中很常用的一项操作就是用String的split方法获取字符串中不同的字段值。本文主要整理split分割后得到的数组长度相关问题。后续代码中分隔符假定为‘\t’

二、使用情况说明:

1.split(regex)

先来看一下下面代码:

String str1 = "20151117\t10.10.0.1\t1447748109000\t\t";
String str2 = "20151117\t10.10.0.1\t1447748109000\t\tJim";
String[] fields1 = str1.split("\t");
System.out.println("length:" + fields1.length);
for(String value : fields11){
 System.out.println(value);
}
String[] fields2 = str2.split("\t");
System.out.println("length:" + fields2.length);
for(String value : fields11){
 System.out.println(value);
}

上述代码的输出结果是:

length:3
20151117
10.10.0.1
1447748109000
length:5
20151117
10.10.0.1
1447748109000

Jim

我们希望一个‘\t’对应两个字段的分割,且允许字段取值为空。
如果这类字段在字符串的结尾处,有时分割的长度就会不一样(上述例子中的fields1.lengthfields2.length)。

 

2.split(regex, limit(=-1))

为此,我们先看一下String类中split方法的使用说明:
Modifier and Type      Method and Description
String[]                          split(String regex)
Splits this string around matches of the given regular expression.
String[]                          split(String regex, int limit)
Splits this string around matches of the given regular expression.
可以看出,String类默认提供两个split调用方式,第1种仅需指明分割符内容,第2种可以额外指定分割后的数组长度。
针对前面的问题,希望split时严格按照分隔符‘\t’的个数来定,能够接受结尾的字段为空。再看下面的例子。

String str1 = "20151117\t10.10.0.1\t1447748109000\t\t";
String str2 = "20151117\t10.10.0.1\t1447748109000\t\tJim";
String[] fields1 = str1.split("\t", -1);
System.out.println("length:" + fields1.length);
for(String value : fields1){
 System.out.println(value);
}
String[] fields2 = str2.split("\t", -1);
System.out.println("length:" + fields2.length);
for(String value : fields2){
 System.out.println(value);
}

上述代码的输出结果是:

length:5
20151117
10.10.0.1
1447748109000

length:5
20151117
10.10.0.1
1447748109000

Jim

由上可知,若 limit 取值为-1时,split默认会考虑全部‘\t’的情况,不会忽略字符串结尾字段为空的内容。
如果limit为其他正数呢。

 

3.split(regex, limit(=2))

String str1 = "20151117\t10.10.0.1\t1447748109000\t\t";
String str2 = "20151117\t10.10.0.1\t1447748109000\t\tJim";
String[] fields1 = str1.split("\t", -1);
System.out.println("length:" + fields1.length);
for(String value : fields1){
 System.out.println(value);
}
String[] fields2 = str2.split("\t", -1);
System.out.println("length:" + fields2.length);
for(String value : fields2){
 System.out.println(value);
}</pre>
<pre>

上述代码的输出结果是:

length:2
20151117
10.10.0.1\t1447748109000\t\t
length:2
20151117
10.10.0.1\t1447748109000\t\tJim

4.split(regex, limit(=6))

String str1 = "20151117\t10.10.0.1\t1447748109000\t\t";
String str2 = "20151117\t10.10.0.1\t1447748109000\t\tJim";
String[] fields1 = str1.split("\t", -1);
System.out.println("length:" + fields1.length);
for(String value : fields1){
 System.out.println(value);
}
String[] fields2 = str2.split("\t", -1);
System.out.println("length:" + fields2.length);
for(String value : fields2){
 System.out.println(value);
}

上述代码的输出结果是:

length:5
20151117
10.10.0.1
1447748109000

length:5
20151117
10.10.0.1
1447748109000

Jim

三、小结:

若使用split(regex, limit) 这种方式时:
1.limit取值为-1时,分割后数组的长度与分隔符的个数有关;
2.limit取值小于字段个数时,分割后数组的长度为limit
3.limit取值大于等于字段个数时,分割后数组的长度为字段长度。

在使用String类中split方法时,我们可能需要留意:
1.split的对象的字段个数以及每个字段的取值形式(可为空、不为空等);
2.分隔符是否包含转义字符(本文暂不做深入探讨),若包含则需要留意regex的值;
3.根据需求确定符合要求的分割调用方式,另做好异常的捕获及记录,毕竟真实环境下每个字段的取值还是可能存在意外情况。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>