java字符串按照特定字符分割_java 字符串分割

java字符串按照特定字符分割_java 字符串分割问题描述://把字符串”192.168.1.1″按照小圆点进行分割,分割成”192″,”168″,”1″,”1″四个字符串。StringpreStr=”192.168.1.1″;String[]string=preStr.split(“.”);//错误写法。这种写法得到的字符串组长度为0String[]string=preStr.split(“\\.”);//正确写法。对…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

问题描述:

// 把字符串”192.168.1.1″按照小圆点进行分割,分割成”192″,”168″,”1″,”1″四个字符串。

String preStr = “192.168.1.1”;

String[] string = preStr.split(“.”); // 错误写法。这种写法得到的字符串组长度为0

String[] string = preStr.split(“\\.”); //正确写法。对小圆点进行转义

出现上述情况的原因是:split函数会将参数看作是正则表达式进行处理。”.”在正则表达式中表示匹配任意一个字符,经过转义之后,”.”才是本身的含义,才能得到正确的分割结果。下面主要探讨上述错误写法中得到的字符串组为什么大小为0。

下面是split函数源代码(java.util.regex.Pattern.split)

public String[] split(CharSequence input, int limit) {

int index = 0;

boolean matchLimited = limit > 0; // 是否限制匹配个数

ArrayList matchList = new ArrayList(); // 匹配结果队列

Matcher m = matcher(input); // 待切割字符(串)匹配对象

// Add segments before each match found

while (m.find()) {

// 如果不限制匹配个数 或者 当前结果列表的大小小于limit-1

if (!matchLimited || matchList.size() < limit – 1) {

String match = input.subSequence(index, m.start()).toString(); // 取子串,(分隔串所在的首位)

matchList.add(match); // 添加进结果集

index = m.end(); // 获取下一个子串的首字符下标

} else if (matchList.size() == limit – 1) { // last one,即还剩最后一个名额了

// 最后一个元素从指针取到字符串结尾

String match = input.subSequence(index, input.length()).toString();

matchList.add(match);

index = m.end();

}

}

// If no match was found, return this

if (index == 0) // 即没有切分到的意思吧,返回整一串

return new String[] { input.toString() };

// 如果不限制匹配个数 或者结果集大小小于限制个数

if (!matchLimited || matchList.size() < limit)

// 最后一个元素从指针取到字符串结尾

matchList.add(input.subSequence(index, input.length()).toString()); // Construct

// result

int resultSize = matchList.size();

if (limit == 0)

// 如果结果集最后的元素是””,一个一个地删除它们

while (resultSize > 0 && matchList.get(resultSize – 1).equals(“”))

resultSize–;

String[] result = new String[resultSize];

return matchList.subList(0, resultSize).toArray(result);

}

代码中注释转自https://www.cnblogs.com/xzhang/p/3995464.html

正则表达式中“.”表示匹配任意一个字符。对于split函数而言,就是就是以任意字符为分隔符进行分割,那么“192.168.1.1”按照任意字符分割等价于“ccccccccccc”按照“c”进行分割,那么分割结果肯定都是空串。split函数中最后的while循环会将分割之后的字符串组,从后往前清理空字符串,所以“.”在不转义的情况下,分割字符串得到的结果为空。

代码中,Matcher m = matcher(input)中,m记录下每个分隔符的位置。例如“abc;efg;hig”中,分隔符“;”的位置是3,7。m.start()可以获取到第一个分隔符的索引3,利用函数subSequence(int start, int end)进行分割,所以第一个子串传入参数[start = 0,end = 3],m.end()获取当前匹配到的分隔符之后的位置4;m.find()寻找下一个分隔符位置,m.start()为7,第二个字串[start = 4,end = 7];以此类推。

对于字符串“192.168.1.1”按照“.”进行分割时,分隔符的位置为0,1,2,3,4,…,10,11,每个子串是[0,0],[1,1][2,2],…,[10,10],[11,11]。对于函数subSequence(int start, int end),end==start时返回空串。所以最后得到的结果也是空串。

以上是一些简单分析,有不对的地方请大家多指教。

下面附上相关的函数说明,便于大家理解:

m.start() //Returns the start index of the previous match.

m.end()   //Returns the offset after the last character matched.

m.find()  //Attempts to find the next subsequence of the input sequence that matches the pattern

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188829.html原文链接:https://javaforall.net

(0)
上一篇 2026年4月15日 下午2:28
下一篇 2026年4月15日 下午2:34


相关推荐

  • spring 整合JDBC

    spring 整合JDBC

    2021年11月28日
    46
  • 价值3888开源企业发卡网源码/全网对接/全新UI风格/完美运营

    价值3888开源企业发卡网源码/全网对接/全新UI风格/完美运营介绍:系统是全开源的,功能很多就不一一介绍了,喜欢就拿走,互站上卖3888免费开源,100%能搭建!老米发卡系统功能亮点介绍:1:已接入易支付接口/支持qq/微信/支付宝2:全网商品对接,店铺对接一秒完成对接,!3:商品池系统/供货系统/代理系统/对接码对接商品4:店铺音乐支付接口/缩我短网址接口/销售模版主题设置5:后台新增一键添加支付接口/商品池权限/推荐商品权限/商家保证金6:平均有15套pc售卡模版,3套手机售卡模版7:一些系统还带有后门,我这个系统完全无后门8:本系统不敢说全

    2022年7月14日
    22
  • [DLX反复覆盖] hdu 3656 Fire station[通俗易懂]

    [DLX反复覆盖] hdu 3656 Fire station

    2022年2月6日
    57
  • 计算机设备问题代码43,设备管理器错误代码(代码43)的六种解决方法

    内容一、“由于此设备存在问题,Windows已将其停止(代码43)”),这是问题的原因原因分析:代码43错误是多个设备管理器错误代码之一。当设备管理器停止硬件设备时,会生成此错误,这可能是由硬件设备或设备驱动程序故障引起的。设备管理器错误代码(代码43)的详细信息可以在设备属性的“设备状态”区域中找到。引起问题的设备将在设备中用感叹号标记)设备管理器,如下图所示:有关如何解决此问题的信息,…

    2022年4月4日
    215
  • java之数组和链表的区别「建议收藏」

    java之数组和链表的区别「建议收藏」数组是有下标索引和data两部分组成链表是有data和指向下一个数据的指针地址两部分组成数组的特点 在内存中,数组是一块连续的区域。拿上面的看电影来说,这几个人在电影院必须坐在一起。 数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间。比如看电影时,为了保证10个人能坐在一起,必须提前订好10个连续的位置。这样的好处就是能保证10个人可以在一起。但是这样的缺…

    2022年6月25日
    27
  • plsql 注册码「建议收藏」

    plsql 注册码「建议收藏」plsql下载地址https://www.allroundautomations.com/bodyplsqldevreg.html12.0.3.182164bit:注册码:ProductCode(产品编号):jtrexa75fat2mgcetfhx767laqrbtssqrkserialNumber(序列号):335566password:xs374ca12.0…

    2022年7月13日
    107

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号