咦,Java拆分个字符串都这么讲究(2)

简介: 咦,Java拆分个字符串都这么讲究

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("沉默王二.一枚有趣的程序员");
        System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
    }
}


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


public class TestPatternMatch {
    /**
     * 使用预编译功能,提高效率
     */
    private static Pattern twopart = Pattern.compile("(.+)\\.(.+)");
    public static void main(String[] args) {
        checkString("沉默王二.一枚有趣的程序员");
        checkString("沉默王二.");
        checkString(".一枚有趣的程序员");
    }
    private static void checkString(String str) {
        Matcher m = twopart.matcher(str);
        if (m.matches()) {
            System.out.println("第一部分:" + m.group(1) + " 第二部分:" + m.group(2));
        } else {
            System.out.println("不匹配");
        }
    }
}



这时候,正则表达式为 (.+)\\.(.+),意味着可以把字符串按照英文逗点拆分成一个字符组,英文小括号 () 的作用就在于此(可以查看我之前提供的正则表达式手册)。


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


来看一下程序的输出结果:


第一部分:沉默王二 第二部分:一枚有趣的程序员

不匹配

不匹配



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


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


String cmower = "沉默王二,一枚有趣的程序员";
if (cmower.contains(",")) {
    String [] parts = cmower.split("(?<=,)");
    System.out.println("第一部分:" + parts[0] +" 第二部分:" + parts[1]);
}



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


第一部分:沉默王二, 第二部分:一枚有趣的程序员

1

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


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

1

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


image.png


温馨提醒:如果对断言模式比较生疏的话,可以查看我之前提供的正则表达式手册。


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


String cmower = "沉默王二,一枚有趣的程序员,宠爱他";

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

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

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

}


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


image.png


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


第一部分:沉默王二 第二部分:一枚有趣的程序员,宠爱他




好了,我亲爱的读者朋友,以上就是本文的全部内容了。是不是突然感觉拆分个字符串真的挺讲究的?


我是沉默王二,一枚有趣的程序员。如果觉得文章对你有点帮助,请微信搜索「 沉默王二 」第一时间阅读。


相关文章
|
22天前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
97 60
|
12天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
34 6
|
1月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
46 15
|
1月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
50 4
|
2月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
51 3
|
2月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
18 2
|
2月前
|
存储 移动开发 Java
java核心之字符串与编码
java核心之字符串与编码
22 2
|
12天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
8天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
28 9
|
11天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####