Java切割字符串的踩坑实战记录

作者:小的~~ 时间:2023-02-05 14:13:25 

坑出现的环境

一般情况下切割字符串会使用split或者StringTokenizer,如下代码

String s = ",,o,,";
String[] split = s.split(",");

期望得到数组["","","o","",""],但是实际上会得到["","","o"],后面两个直接被忽略了,如IDEA运行

Java切割字符串的踩坑实战记录

 StringTokenizer默认情况下

String s = ",,o,,";
StringTokenizer token = new StringTokenizer(s,",");
String[] arr = new String[token.countTokens()];
int i = 0;
while (token.hasMoreElements()){
   arr[i++] = token.nextToken();
}

在IDEA中得到的运行结果

Java切割字符串的踩坑实战记录

 当StringTokenizer第三个参数改为true时

StringTokenizer token = new StringTokenizer(s,",",true);

Java切割字符串的踩坑实战记录

 貌似得到了想要的结果,但是当要切割的字符串改为下面这样时

String s = ",k,o,,";
StringTokenizer token = new StringTokenizer(s,",",true);
String[] arr = new String[token.countTokens()];
int i = 0;
while (token.hasMoreElements()){
   arr[i++] = token.nextToken();
}

得到的结果是

Java切割字符串的踩坑实战记录

数组的数量与预期也不符。

实际上java的split内部会按照预期的样子把字符串切割好,但是第二个参数不传的情况下默认是0,这就是会导致后面空字符串的值被丢弃

在String的split方法中可以看到

Java切割字符串的踩坑实战记录

 从注释说明中可以看到,通过改变第二个参数可以得到预期的结果

Java切割字符串的踩坑实战记录

StringTokenizer内部也会判断切割后的值长度是否大于0,大于的情况下才会存储起来

问题的解决

通过设置split的第二个参数为-1

String s = ",k,o,,";
String[] split = s.split(",",-1);

Java切割字符串的踩坑实战记录

补充:java分割字符串常见语法

一.java.lang.String.split()

在java 默认的分隔符是空格("")、制表符(\t)、换行符(\n)、回车符(\r)

示例:

for(String revaal:s.split(" ")){//用空格分隔
       System.out.println(count+"ci"+revaal);
         }

或者

String sourceStr = "1,2,3,4,5";
String[] sourceStrArray = sourceStr.split(",");
for (int i = 0; i < sourceStrArray.length; i++) {
   System.out.println(sourceStrArray[i]);
}

如果需要指定分割后的数量的话,可以在split方法中再传入指定数量即可。

String[] sourceStrArray = sourceStr.split(",",4);

split 的实现直接调用的 matcher 类的 split 的方法。在使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。在正则表达式中有特殊的含义的字符,我们使用的时候必须进行转义,

1.字符"|","*","+&ldquo;都得加上转义字符,前面加上&rdquo;\"。

2.而如果是"",那么就得写成"\\"。

3.如果一个字符串中有多个分隔符,可以用"|"作为连字符。

二.java.util.StringTokenizer()

StringTokenizer 构造方法:

  1. StringTokenizer(String str) :构造一个用来解析 str 的 StringTokenizer 对象。java 默认的分隔符是空格("")、制表符(\t)、换行符(\n)、回车符(\r)。

  2. StringTokenizer(String str, String delim) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符。

  3. StringTokenizer(String str, String delim, boolean returnDelims) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符,同时,指定是否返回分隔符。

示例:

public static void main(String[] args)
   {
       String str = "runoob,google,taobao,facebook,zhihu";
       // 以 , 号为分隔符来分隔字符串
       StringTokenizer st=new StringTokenizer(str,",");
       while(st.hasMoreTokens()) {
           System.out.println(st.nextToken());
       }
   }

StringTokenizer 常用方法:

  1. int countTokens():返回nextToken方法被调用的次数。

  2. boolean hasMoreTokens():返回是否还有分隔符。

  3. boolean hasMoreElements():判断枚举 (Enumeration) 对象中是否还有数据。

  4. String nextToken():返回从当前位置到下一个分隔符的字符串。

  5. Object nextElement():返回枚举 (Enumeration) 对象的下一个元素。

  6. String nextToken(String delim):与 4 类似,以指定的分隔符返回结果。

来源:https://blog.csdn.net/k7gxn56/article/details/127751164

标签:java,切割,字符串
0
投稿

猜你喜欢

  • C++实现大整数乘法(字符串乘法)

    2021-10-23 16:37:22
  • Android中执行java命令的方法及java代码执行并解析shell命令

    2022-08-27 15:45:13
  • 深入理解Java设计模式之组合模式

    2023-09-02 02:06:25
  • Unity3D实现鼠标控制视角转动

    2023-11-22 21:18:46
  • SpringBoot 整合 ElasticSearch操作各种高级查询搜索

    2023-03-25 17:12:40
  • Java 使用getClass().getResourceAsStream()方法获取资源

    2023-07-23 08:59:56
  • 全面解析SpringBoot文件上传功能

    2023-02-26 15:55:56
  • IDEA:Git stash 暂存分支修改的实现代码

    2023-11-29 09:16:35
  • 详解在springboot中使用Mybatis Generator的两种方式

    2021-10-12 14:26:44
  • JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

    2023-11-24 19:36:02
  • 使用JPA主键@Id,@IdClass,@Embeddable,@EmbeddedId问题

    2022-07-07 18:35:41
  • 利用unity代码C#封装为dll的步骤分享

    2023-12-02 00:31:00
  • Java过滤器doFilter里chain.doFilter()函数的理解

    2023-11-11 14:45:50
  • Android性能优化之plt hook与native线程监控详解

    2021-09-10 22:06:01
  • StringBuilder为什么线程不安全深入讲解

    2023-01-24 01:52:55
  • Java编程使用箱式布局管理器示例【基于swing组件】

    2022-08-12 14:09:14
  • 基于C# winform实现图片上传功能的方法

    2022-09-12 18:18:14
  • 利用Kotlin + Spring Boot实现后端开发

    2022-02-20 05:30:19
  • C#开发WinForm根据条件改变DataGridView行颜色

    2022-05-06 05:38:56
  • Spring中的事务隔离级别和传播行为

    2022-07-21 18:18:24
  • asp之家 软件编程 m.aspxhome.com