Java切割字符串的踩坑实战记录
作者:小的~~ 发布时间:2023-02-05 14:13:25
坑出现的环境
一般情况下切割字符串会使用split或者StringTokenizer,如下代码
String s = ",,o,,";
String[] split = s.split(",");
期望得到数组["","","o","",""],但是实际上会得到["","","o"],后面两个直接被忽略了,如IDEA运行
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中得到的运行结果
当StringTokenizer第三个参数改为true时
StringTokenizer token = new StringTokenizer(s,",",true);
貌似得到了想要的结果,但是当要切割的字符串改为下面这样时
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的split内部会按照预期的样子把字符串切割好,但是第二个参数不传的情况下默认是0,这就是会导致后面空字符串的值被丢弃
在String的split方法中可以看到
从注释说明中可以看到,通过改变第二个参数可以得到预期的结果
StringTokenizer内部也会判断切割后的值长度是否大于0,大于的情况下才会存储起来
问题的解决
通过设置split的第二个参数为-1
String s = ",k,o,,";
String[] split = s.split(",",-1);
补充: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.字符"|","*","+“都得加上转义字符,前面加上”\"。
2.而如果是"",那么就得写成"\\"。
3.如果一个字符串中有多个分隔符,可以用"|"作为连字符。
二.java.util.StringTokenizer()
StringTokenizer 构造方法:
StringTokenizer(String str) :构造一个用来解析 str 的 StringTokenizer 对象。java 默认的分隔符是空格("")、制表符(\t)、换行符(\n)、回车符(\r)。
StringTokenizer(String str, String delim) :构造一个用来解析 str 的 StringTokenizer 对象,并提供一个指定的分隔符。
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 常用方法:
int countTokens():返回nextToken方法被调用的次数。
boolean hasMoreTokens():返回是否还有分隔符。
boolean hasMoreElements():判断枚举 (Enumeration) 对象中是否还有数据。
String nextToken():返回从当前位置到下一个分隔符的字符串。
Object nextElement():返回枚举 (Enumeration) 对象的下一个元素。
String nextToken(String delim):与 4 类似,以指定的分隔符返回结果。
来源:https://blog.csdn.net/k7gxn56/article/details/127751164


猜你喜欢
- 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。步骤为:1.从数
- 本文实例为大家分享了Android霓虹闪烁文字效果的具体代码,供大家参考,具体内容如下package com.example.apple.s
- Logback 背景Logback是由log4j创始人设计的另一个开源日志组件,官方网站:http://logback.qos.ch。它当前
- 目录推荐教程正文创建-服务端-生成代码创建客户端,生成客户端代码先下载soapUI工具推荐教程idea2021以下最新安装j ihuo 教程
- 配置Servlet的方法有俩种,分别是传统web.xml文档中部署servlet和注解方式部署servlet,下面就先一起来学习 * 解方式部
- 安卓虽然已经成为了移动设备第一操作系统,且影响力也延伸到了汽车和tv端,不过对于谷歌来说,需要依靠Java来做安卓开发一直是一个心病,因为O
- 从这章开始,会介绍几个常用的函数式接口工具,首先先来看下这个大家族:首先从Function接口开始介绍一. 概述该接口顾名思义,函数的意思,
- 一,项目简介经过调查研究进行开发设计的这款仓库管理系统,主要是为商家提供商品货物进销存的信息化管理,以便让商家在竞争如此激烈的今天占据一定的
- 一、html代码 &n
- 前言前一篇文章讲了View的触发反馈机制的原理,对于一个自定义View而言,手势的处理都是重写onTouchEvent函数,或者通过setO
- G1 – Garbage First(垃圾优先算法)G1最主要的设计目标是: 将STW停顿的时间和分布变成可预期以及可配
- utf-8转unicode public static String utf8ToUnicode(String inStr) {  
- 本文实例为大家分享了Android实现京东首页效果的具体代码,供大家参考,具体内容如下1.效果图:2.布局源码链接<?xml vers
- 栅栏类似闭锁,但是它们是有区别的.1.闭锁用来等待事件,而栅栏用于等待其他线程.什么意思呢?就是说闭锁用来等待的事件就是countDown事
- 本文介绍一个C#函数,可以实现计算文件的MD5值,可以用于文件传输后进行有效性校验。我们知道可以通过将一个字符串进行散列(Hash)运算得到
- 目录一、内部类1.什么是内部类?1.类作为形参和返回值:2.内部类的几种形式二、Lambda表达式(强调做什么,而不是以什么形式去做)1.L
- 分布式限流-单位时间多实例多线程访问次数限制接前面聊一聊redisson及优雅实现 和 说一说spring boot优雅集成redisson
- 在android中,照相功能系统已经提供,在app中可以直接使用。当手机从android play里面下载有照相功能的应用时, 会判断手机是
- 目前为止,许多编程语言和工具都包含对正则表达式的支持,C#也不例外,C#基础类库中包含有一个命名空间(System.Text.Regular
- 一、项目简述环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,