说到 Java 字符串拆分,我们可能会不假思索“这有什么难的,直接上 String 类的 split() 方法不就行了!”假如你真的这么觉得,那可要真的是大错特错了。其中缘由,且听我细细道来。

假如现在有这样一串字符“hello world,一个有趣的程序”,需要按照中文的逗号“,”进行拆分,这意味着第一串字符为逗号前面的“hello world”,第二串字符为逗号后面的“一个有趣的程序”。另外,在拆分之前,要先进行检查,判断一下这串字符是否包含逗号,否则应该抛出异常。

public class Test {

public static void main(String[] args) {

String cmower = “hello world,一个有趣的程序”;

if (cmower.contains(",")) {

String [] parts = cmower.split(",");

System.out.println(“第一部分:” + parts[0] +" 第二部分:" + parts[1]);

} else {

throw new IllegalArgumentException(“当前字符串没有包含逗号”);

}

}

}

这段代码看起来挺严谨的,对吧?程序输出的结果完全符合预期:

第一部分:hello world 第二部分:一个趣的程序员

这是建立在字符串是确定的情况下,最重要的是分隔符是确定的。否则,麻烦就来了。

大约有 12 种英文特殊符号,如果直接拿这些特殊符号替换上面代码中的分隔符(中文逗号),这段程序在运行的时候就会出现以下提到的错误。

反斜杠 (ArrayIndexOutOfBoundsException)

插入符号 ^(同上)

美元符号 $(同上)

逗点 .(同上)

竖线 |(正常,没有出错)

问号 ?(PatternSyntaxException)

星号 *(同上)

加号 +(同上)

左小括号或者右小括号 ()(同上)

左方括号或者右方括号

左大括号或者右大括号 {}(同上)

看到这,可能有小伙伴会说,“这不是钻牛角尖嘛”,不不不,做技术就应该秉持严谨的态度,否则,很容易出现致命的错误。

那遇到特殊符号该怎么办呢?上正则表达式呗。

正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。

解决了心病之后,我们来用英文逗点“.”来替换一下分隔符:

String cmower = “hello world,一个有趣的程序”;

if (cmower.contains(".")) {

String [] parts = cmower.split("\.");

System.out.println(“第一部分:” + parts[0] +" 第二部分:" + parts[1]);

}

在使用 split() 方法的时候,就需要使用正则表达式 \. 来替代特殊字符英文逗点“.”了。为什么用两个反斜杠呢?因为它本身就是一个特殊字符,需要先转义。

也可以使用字符类 [] 来包含英文逗点“.”,它也是一个正则表达式,用来匹配方括号中包含的任意字符。

cmower.split("[.]");

除此之外, 还可以使用 Pattern 类的 quote() 方法来包裹英文逗点“.”,该方法会返回一个使用 \Q\E 包裹的字符串。

此时,String.split() 方法的使用示例如下所示:

String [] parts = cmower.split(Pattern.quote("."));

当通过调试模式进入 String.split() 方法源码的话,会发现以下细节:

return Pattern.compile(regex).split(this, limit);

String 类的 split() 方法调用了 Pattern 类的 split() 方法。也就意味着,我们字符串拆分有了新的选择,可以不使用 String 类的 split() 方法了。

public class TestPatternSplit {

/**

  • 使用预编译功能,提高效率

*/

private static Pattern twopart = Pattern.compile("\.");

public static void main(String[] args) {

String [] parts = twopart.split(“hello world.一个有趣的程序”);

System.out.println(“第一部分:” + parts[0] +" 第二部分:" + parts[1]);

}

}

除此之外,还可以使用 Pattern 配合 Matcher 类进行字符串拆分,这样做的好处是可以对要拆分的字符串进行一些严格的限制。

由于模式是确定的,所以可以把 Pattern 表达式放在 main() 方法外面,通过 static 的预编译功能提高程序的效率。

不过,使用 Matcher 来匹配一些简单的字符串时相对比较沉重一些,使用 String 类的 split() 仍然是首选,因为该方法还有其他一些牛逼的功能。

比如说,你想把分隔符包裹在拆分后的字符串的第一部分,可以这样做:

String cmower = “hello world,一个有趣的程序”;

if (cmower.contains(",")) {

String [] parts = cmower.split("(?<=,)");

System.out.println(“第一部分:” + parts[0] +" 第二部分:" + parts[1]);

}

程序输出的结果如下所示:

第一部分:hello world, 第二部分:一个有趣的程序

可以看到分隔符“,”包裹在了第一部分,如果希望包裹在第二部分,可以这样做:

String [] parts = cmower.split("(?=,)");

可能有些小伙伴很好奇,?<= 和 ?= 是什么东东啊?它其实是正则表达式中的断言模式。

另外,假如说字符串中包含了多个分隔符,而我们只需要 2 个的话,还可以这样做:

String cmower = “hello world,一个有趣的程序,收藏”;

if (cmower.contains(",")) {

String [] parts = cmower.split(",", 2);

System.out.println(“第一部分:” + parts[0] +" 第二部分:" + parts[1]);

}

split() 方法可以传递 2 个参数,第一个为分隔符,第二个为拆分的字符串个数。查看该方法源码的话,你就可以看到以下内容:

直接 substring() 到原字符串的末尾,也就是说,第二个分隔符处不再拆分。然后就 break 出循环了。来看一下程序输出的结果:

第一部分:hello world 第二部分:一个有趣的程序,收藏

Java字符串拆分详解相关推荐

  1. Java字符串格式化详解

    在 Java 的 String 类中,可以使用 format() 方法格式化字符串,该方法有两种重载形式: String.format(String format, Object- args) 和 S ...

  2. java 字符拼接_七种java字符串拼接详解

    01."+"号操作符 要说姿势,"+"号操作符必须是字符串拼接最常用的一种了,没有之一. String chenmo = "沉默"; Str ...

  3. Java正则表达式及字符串处理详解

    java正则表达式及字符串处理详解 本篇博文主要是对java String类涉及正则表达式方法及java.util.regex包中相关类和方法的一个总结 String类 相关方法 boolean ma ...

  4. java用 拼接字符串的原理_Java String 拼接字符串原理详解

    首先来一道思考题: String str1 = "111111"; String str2 = "222222"; String str = str1 + st ...

  5. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  6. java源码详解——String类

    java源码详解--String类目录: Java String 类 下面开始介绍主要方法: Java charAt() 方法 Java compareTo() 方法 int compareTo(St ...

  7. Java Pattern类详解

    Java Pattern类详解 Pattern在java.util.regex包中,是正则表达式的编译表示形式,此类的实例是不可变的,可供多个并发线程安全使用. 定义 public final cla ...

  8. java拉姆达表达式事例,Java Lambda表达式详解和实例

    简介 Lambda表达式是Java SE 8中一个重要的新特性.lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体( ...

  9. Java注解(Annotation)详解

    转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...

最新文章

  1. MongoDB分布式原理以及read-preference和readConcern解决读写一致性问题
  2. 干货 | 神经网络原来这么简单,机器学习入门贴送给你
  3. 强烈推荐可以玩上一整天的游戏网站
  4. 20个将 JavaScript 用到极致的网站
  5. 简书 html标签,html标签
  6. java 邮件 附件_java中javamail发送带附件的邮件实现方法
  7. 在apache中设置访问目录后进入的默认页面为index.php
  8. C和指针之memmove函数 memcpy函数 strcspn函数 strspn函数 strrstr函数实现
  9. SpringMVC之——转发与重定向
  10. elementui源码_Element UI 终于还是来啦
  11. 什么鬼?弃用JDK动态代理,Spring5 默认使用 CGLIB 了?
  12. java pcm16位_Java – 将16位带符号的pcm音频数据数组转换为双数组
  13. python培训班-Python培训机构有哪些值得推荐?
  14. c语言经典面试题 洗牌,网易游戏面试题:如何设计一个公平的洗牌算法
  15. 初级药师职称需要考计算机英语吗,药师职称评审政策解读:初级药师不用再考了!...
  16. 京东FBP、LBP、SOP、SOPL 四种分别是什么意思?
  17. JavaSE_语法基础
  18. 吴恩达机器学习中文版课后题(中文题目+数据集+python版答案)week1 线性回归
  19. 举例说明协方差矩阵的运算
  20. 如何重置Photoshop首选项?ps重置首选项的方法

热门文章

  1. Android10读写权限
  2. 纯js实现文件下载并重命名功能
  3. 基于深度学习的信息隐藏技术的研究总结(一)
  4. linux系统查看网口流量,linux 查看网口流量
  5. QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection
  6. k8s.io/client-go@v0.20.2/tools/cache/reflector.go:167: Failed to watch *v1beta1.Ingress: failed to l
  7. 【CSS】绝对定位元素设置 水平 / 垂直 居中 ( 绝对定位元素居中设置 - 先偏移 50% 再回退子元素一半尺寸 | 绝对定位居中设置 )
  8. [基于富瀚6630平台实现U盘热插拔检测并mount]
  9. 747D. Winter Is Coming
  10. 高通华裔工程师跳楼自杀,任职7年后遭解雇