浅谈String.split()遇到空字符串的几种情况
作者:杜. 发布时间:2021-11-24 00:18:38
Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组
split 方法
该方法的作用是:将一个字符串分割为子字符串,然后将结果作为字符串数组返回。
stringObj.split([separator,[limit]])
stringObj
必选项。要被分解的 String 对象或文字,该对象不会被split方法修改。
separator
可选项。字符串或正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。
limit
参数控制模式应用的次数,因此影响所得数组的长度。如果该限制 n 大于 0,则模式将被最多应用 n - 1 次,数组的长度将不会大于 n,而且数组的最后一项将包含所有超出最后匹配的定界符的输入。
如果 n 为非正,那么模式将被应用尽可能多的次数,而且数组可以是任何长度。如果 n 为 0,那么模式将被应用尽可能多的次数,数组可以是任何长度,并且结尾空字符串将被丢弃。
会遇到以下几种情况:
1.空字符串不被解析
public class test {
public static void main(String[] args) {
String str = "1,2,3,4,,,";
String[] arr = str.split(",");
for (String string : arr) {
System.out.println("str"+string);
}
System.out.println(arr.length);
}
}
结果1:
2.最后一个分隔符被分的字符串不为空时,其余空字符串可被解析。
public class test {
public static void main(String[] args) {
String str = "1,2,3,4,,,5";
String[] arr = str.split(",");
for (String string : arr) {
System.out.println("str"+string);
}
System.out.println(arr.length);
}
}
结果2:
但是在实际开发的时候不能保证最后一个分隔符被分的字符串为不空,所以在用split()这个方法后再取被分隔的字符串数组的时候有时候就出现数据越界的问题(最后一个分隔符被分的字符串为空)
想到了一个方法是split([separator,[limit]]) ,后面把limit赋值成比该字符串被分隔成字符数组后数组的长度大很多的值,这能保证所有为空的都能被解析,这正应了api里的解释:
3.如果该限制 n 大于 0,则模式将被最多应用 n - 1 次(此时n为1000)
public class test {
public static void main(String[] args) {
String str = "1,2,3,4,,,";
String[] s = str.split(",",1000);
for (String string : s) {
System.out.println("str"+string);
}
System.out.println(s.length);
}
}
结果3:
4.如果把limit设置为非正,也能全部解析如:
public class test {
public static void main(String[] args) {
String str = "1,2,3,4,,,";
String[] s = str.split(",",-1);
for (String string : s) {
System.out.println("str"+string);
}
System.out.println(s.length);
}
}
结果4:
当String str = "1,2,3,4,,,5";时分别与上述结果3,4一致。
1.当参数为整数的时候,只需要截取前几个,需要几个截取几个,这个不用多说。
Java代码
String line = "aa,bb,cc,dd,,,," ;
System.out.println(line.split( "," , 6 ).length);
输出结果为 6 ,limit参数指定几个,输出几个,最多为 8 个
2.当参数为零的时候,和split()一样,截图尽可能多的字符串(其实不是最多的)。
Java代码
String line = "aa,bb,cc,dd,,,," ;
System.out.println(line.split( "," , 0 ).length);
输出结果为 4
3.当参数为负的时候,即使后面有空的串,也会输出到最大
Java代码
String line = "aa,bb,cc,dd,,,," ;
System.out.println(line.split( "," ,- 1 ).length);
输出结果为 8
注意:
1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
2、如果用“|”作为分隔的话,必须是如下写法,String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");
来源:https://blog.csdn.net/qqxyy99/article/details/78861109


猜你喜欢
- jstack - Prints Java thread stack traces for a Java process, core file
- 一、基础很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定
- 前言Groovy 是一种基于 JVM 的动态语言,与 Java 语言紧密集成,可以很方便地在 Java 项目中使用。Groovy 有着简洁的
- 本文实例讲述了C#实现获取不同对象中名称相同属性的方法。分享给大家供大家参考。具体如下:【两个类】class demo1{ public s
- 本文实例为大家分享了Android自定义输入法软键盘的具体代码,供大家参考,具体内容如下1 功能描述触屏设备主界面中有一个文本编辑框,底部区
- 本文实例讲述了Java二维数组简单定义与使用方法。分享给大家供大家参考,具体如下:Java的二维数组是先创建一个一维数组,然后该数组的元素再
- 前言在开发中我们经常要使用图片或者drawable文件夹下的xml,来实现一些效果,Drawable的用法都和xml相关,我们可以使用sha
- 最近刚换了电脑,开始搭建Android开发环境的时候,下载SDK总是会出现如下错误:Failed to fetch URL http://d
- 本文所述为C#实现根据指定容器和控件名字获得控件的方法,在进行C#应用程序设计时有一定的借鉴价值。分享给大家供大家参考借鉴。具体实现方法如下
- ProxyFactory是创建代理类的工厂接口,其中的setProperties方法用来对工厂进行属性设置,但是mybatis内置的两个实现
- 1. 什么是单例模式单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的
- 1:RabbitMQ是个啥?(专业术语参考自网络)RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间
- 在系统的管理员有着实际的应用,对于一个数据库管理系统来说,数据库安全还是挺重要的,所以在存入到数据库的密码通常都是加密的。即使有着hack攻
- 本文以Java代码为例介绍如何实现将彩色PDF文件转为灰度(黑白)的PDF文件,即:将PDF文档里面的彩色图片或者文字等通过调用PdfGra
- 在Java的内存分配中,总共3种常量池:Java 常量池详解(二)class文件常量池 和 Java 常量池详解(三)class运行时常量池
- Spark的算子的分类从大方向来说,Spark 算子大致可以分为以下两类:1)Transformation 变换/转换算子:这种变换并不触发
- C# 7 里面的Pattern Mathing 更多内容请查看官方文档:https://docs.microsoft.com/zh-cn/d
- 本文实例为大家分享了Handler实现倒计时功能的具体代码,供大家参考,具体内容如下1、需求1.1 实现目标当后台传递一个时间戳时,与当前系
- 一. 概念简介在开始学习今天的知识之前,有必要先给大家讲解一下与今天内容相关的一些概念,否则可能会让一些小白产生迷惑。1. 日期和时间的区别
- 实例如下:MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean(); &