• Java 文本检索神器 "正则表达式"


    Java 文本检索神器 "正则表达式"

    在这里插入图片描述

    每博一文案

    在我们短促而又漫长的一生中,我们在苦苦地寻找人生的幸福,可幸福往往又与我们失之交臂,
    当我们为此而耗尽宝贵的。青春年华,皱纹也悄悄地爬上了眼角的时候,我们或许才能悄悄懂得生活实际上意味
    着什么。
                                         —————— 《平凡的世界》
    叶赛宁的诗,不惋惜,不呼唤,我也不啼哭。金黄的落叶堆满我心间。我已经再不是青春少年。
                                         —————— 《平凡的世界》
    生活中有那么一种人,你蔑视甚至污辱他,他不仅视为正常,还对你挺佩服;你要是在人格上对他平等相待,
    他反而倒小看你!这种人的情况,在伟鲁迅的不朽著作中详尽诠释,这里就不再赘述。
                                         —————— 《平凡的世界》
    一个平平常常的日子,细蒙蒙的雨丝夹着一星半点的雪花,正纷纷淋淋地向大地飘洒着。时令已快到惊蛰,
    雪当然再也不会存留,往往还没等落地,就已经消失得无影无踪了。黄土高原严寒而漫长的冬天看来
    就要过去,但那真正温暖的春天还远远地没有到来。
                                        —————— 《路遥》
    

    @

    1. 正则表达式的概述

    我相信,作为一名程序员或者准程序员,你肯定是知道正则表达式的。作为计算机领域最伟大的发明之一,正则表达式简单、强大,它可以极大地提高我们工作中的文本处理效率。现在,各大操作系统、编程语言、文本编辑器都已经支持正则表达式,甚至我还和极客时间的编辑开玩笑说,他们也应该好好学学正则这门手艺。

    正则,就是正则表达式,英文是 Regular Expression,简称 RE。 顾名思义,正则其实就是一种 描述文本内容组成规律的表示方式

    在编程语言中,正则常常用来简化文本处理的逻辑。在 Linux 命令中,它也可以帮助我们轻松地查找或编辑文件的内容,甚至实现整个文件夹中所有文件的内容替换,比如 grep、egrep、sed、awk、vim 等。另外,在各种文本编辑器中,比如 Atom,Sublime TextVS Code 等,在查找或替换的时候也会使用到它。总之,正则是无处不在的,已经渗透到了日常工作的方方面面。

    简单来说,正则是一个非常强大的文本处理工具,它的应用极其广泛。我们可以利用它来校验数据的有效性,比如用户输入的手机号是不是符合规则;也可以从文本中提取想要的内容,比如从网页中抽取数据;还可以用来做文本内容替换,从而得到我们想要的内容。

    通过它的功能和分布的广泛你也能看出来,正则是一个非常值得花时间和精力好好学习的基本技能。之前你花几十分钟才能搞定的事情,可能用正则很快就搞定了;之前不能解决的问题,你系统地学习正则后,可能发现也能轻松解决了。

    1.1 正则表达式的威力

    初始正则表达式,这里我们先来体会一下正则表达式的威力。

    例如01: 下面这段文本是,我们通过爬虫获取到的,下面我们通过正则表达式获取到其中文本的所有英文单词

    Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。Java应用编程接口已经从1.1x版发展到1.2版。常用的Java平台基于Java1.8最近版本为Java19。
    
    package blogs.blog12;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegularTest01 {
        public static void main(String[] args) {
            // 假定,编写了爬虫,从百度页面得到如下文本:
            String content = "Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口," +
                    "可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后," +
                    "Java应用程序就可运行。Java平台已经嵌入了几乎所有的操作系统。" +
                    "这样Java程序可以只编译一次,就可以在各种系统中运行。" +
                    "Java应用编程接口已经从1.1x版发展到1.2版。常用的Java平台基于Java1.8," +
                    "最近版本为Java19。";
    
            // 提取文章中所有的英文单词:
            // 传统方法: 使用遍历方式: 代码量大,效率不高:
            // 正则表达式:
    
            // 1. 先创建一个Pattern 对象,模式对象,可以理解成就是一个正则表达式对象
            Pattern pattern = Pattern.compile("[a-zA-Z]+");
    
            // 2. 创建一个匹配器对象
            // 理解:就是 matcher 匹配器,按照所编写的 pattern(模式/样式) ,到 content 文本中去匹配
            // 找到就返回 true,否则就返回false
            Matcher matcher = pattern.matcher(content);
    
            // 3. 开始循环匹配
            while(matcher.find()) {  // 找到返回 true,否则返回false
                // 匹配内容,文本,放到 matcher.group() 当中
                String group = matcher.group(0);
                System.out.println(group);
            }
        }
    }
    
    

    在这里插入图片描述

    例如02: 提取到上述文本内容中的所有 数字

    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegularTest01 {
        public static void main(String[] args) {
            // 假定,编写了爬虫,从百度页面得到如下文本:
            String content = "Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成。Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口," +
                    "可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后," +
                    "Java应用程序就可运行。Java平台已经嵌入了几乎所有的操作系统。" +
                    "这样Java程序可以只编译一次,就可以在各种系统中运行。" +
                    "Java应用编程接口已经从1.1x版发展到1.2版。常用的Java平台基于Java1.8," +
                    "最近版本为Java19。";
    
            // 1.创建一个正则表达式对象
            Pattern pattern = Pattern.compile("[\\d]+");
    
            // 2.创建一个匹配器,用于匹配符合正则表达式的字符串
            Matcher matcher = pattern.matcher(content);
    
            // 循环遍历获取符合条件的字符串
            while(matcher.find()) { // 一点一点的同文本中遍历匹配是否符合该正则表达式,符合返回true,否则返回false
                String group = matcher.group(0);
                System.out.println(group);
            }
        }
    }
    

    在这里插入图片描述

    例如03 : 如下是一段从 www.baidu.com 网页中截取的一段源码:通过正则表达式获取到其中的百度热搜信息

    在这里插入图片描述

    name="oq" value="">