Java 字符串分割 split 函数使用知多少

最近使用 split 遇到的问题

你是否常常在使用 Java 的字符串 split() 函数,例如字符串简单的分割。

我想大部分人都跟我一样进行简单的分割,也没有发现什么大问题,示例代码如下:

1
2
3
4
public static void main(String[] args) {
String str = "apiVersion|uuid|timestamp|userInfo|arg1|arg2|arg3|args";
String[] arrs = str.split("\\|");
}

image-20191211232109238

但是最近在进行字符串分割的时候,发现想要对下面的字符串进行分割的时候就出现问题了

1
2
3
4
public static void main(String[] args) {
String str = "6.0|ff129239||frank2019|1||3|";
String[] arrs = str.split("\\|");
}

得到的 arrs 数组如下:

image-20191211233831354

我们发现,字符串最后的一个 | 之后没有元素,结尾的空字符串被丢弃了。但实际上在我的业务场景空字符也代表一个占位符,需要分割成 8 个元素的数组。

查看了 split 的源码,发现其实它还有一个重载方法

1
2
3
4
public String[] split(String regex, int limit) {
// ... ...
return Pattern.compile(regex).split(this, limit);
}

如果不想让结尾的空字符串被丢弃,可以这么实现:

1
2
3
4
5
public static void main(String[] args) {
String str = "6.0|ff129239||frank2019|1||3|";
String[] arrs = str.split("\\|",-1);
System.out.println(args);
}

执行效果如下

image-20191211234818473

split(regex) 和 split(regex, limit) 使用知多少

split(regex)方法

  • regex:分割的字符串或者正则表达式,根据字符串中的分割符,进行拆分成字符串数组

split(regex, limit)方法

  • regex:分割的字符串或者正则表达式
  • limit:作用是控制模式应用的次数 (这里的模式理解成:从左往右分割次数即可)
    • Limit<0:模式被应用尽可能多的次数
    • limit =0:表示模式应用尽可能多的次数,数组可以是任意长度,并且结尾空字符串将被丢弃。
    • limit>0:模式将会应用 limit-1 次数组长度不会超过 limit

举例说明

  1. split("6.0|ff129239||frank2019|1||3|",0) 是切割默认模式等同于 split("6.0|ff129239||frank2019|1||3|") 结尾分割字符为空不进行进行分割

  2. split("6.0|ff129239||frank2019|1||3|",-1),limit 参数小于 0 结尾分割字符为空也进行分割

  3. split("6.0|ff129239||frank2019|1||3|",3),不管字符串有多少个符合分割的分隔符,只会从左到右分成长度为 3 的数组