Java常用API第二篇

news2024/9/24 21:28:03

正则表达式:

 

正则表达式(简称 regex)是用来描述字符串模式的工具,常用于字符串的查找、匹配、替换等操作。它在文本处理、数据验证、以及编程中非常常见。以下是正则表达式的基本知识点:

1. 正则表达式的基础符号

  • . (点): 匹配除换行符 \n 以外的任何单个字符。

    • 例如,正则表达式 a.b 可以匹配 "aab""acb",但不能匹配 "ab"
  • ^ (脱字符): 匹配字符串的开始位置。

    • 例如,正则表达式 ^abc 只能匹配以 "abc" 开头的字符串,如 "abc123",但不能匹配 "123abc"
  • $ (美元符号): 匹配字符串的结束位置。

    • 例如,正则表达式 xyz$ 只能匹配以 "xyz" 结尾的字符串,如 "123xyz",但不能匹配 "xyz123"
  • * (星号): 匹配前面的字符 0 次或多次。

    • 例如,正则表达式 ab* 可以匹配 "a""ab""abb""abbb",其中 b 可以出现任意次(包括 0 次)。
  • + (加号): 匹配前面的字符 1 次或多次。

    • 例如,正则表达式 ab+ 可以匹配 "ab""abb",但不能匹配 "a"b 至少出现 1 次)。
  • ? (问号): 匹配前面的字符 0 次或 1 次。

    • 例如,正则表达式 ab? 可以匹配 "a""ab"
  • [] (方括号): 定义字符集合,匹配其中的任意一个字符。

    • 例如,正则表达式 [abc] 可以匹配 "a""b""c" 中的任意一个字符。
  • [^] (脱字符加方括号): 匹配不在方括号中的任意一个字符。

    • 例如,正则表达式 [^abc] 可以匹配任何不是 "a""b""c" 的字符。
  • | (竖线): 表示逻辑或,用于匹配多个模式之一。

    • 例如,正则表达式 abc|def 可以匹配 "abc""def"
  • () (括号): 用于分组,匹配括号内的整个模式。还可以用于捕获组以便后续引用。

    • 例如,正则表达式 (abc)+ 可以匹配 "abc""abcabc"

2. 元字符

  • \d: 匹配任何数字,等价于 [0-9]

    • 例如,正则表达式 \d 可以匹配 "1""7""0" 等数字字符。
  • \D: 匹配任何非数字字符,等价于 [^0-9]

    • 例如,正则表达式 \D 可以匹配 "a""#"" " 等非数字字符。
  • \w: 匹配任何字母、数字或下划线字符,等价于 [a-zA-Z0-9_]

    • 例如,正则表达式 \w 可以匹配 "a""1""_" 等字母、数字或下划线。
  • \W: 匹配任何非字母、数字或下划线字符,等价于 [^a-zA-Z0-9_]

    • 例如,正则表达式 \W 可以匹配 "@"" ""#" 等非字母、数字或下划线字符。
  • \s: 匹配任何空白字符(包括空格、制表符、换行符等)。

    • 例如,正则表达式 \s 可以匹配 " "\t\n 等空白字符。
  • \S: 匹配任何非空白字符。

    • 例如,正则表达式 \S 可以匹配 "a""1""#" 等非空白字符。

3. 量词

  • {n}: 精确匹配前面的字符 n 次。

    • 例如,正则表达式 a{3} 可以匹配 "aaa"
  • {n,}: 至少匹配前面的字符 n 次。

    • 例如,正则表达式 a{2,} 可以匹配 "aa""aaa""aaaa" 等。
  • {n,m}: 匹配前面的字符至少 n 次,至多 m 次。

    • 例如,正则表达式 a{2,4} 可以匹配 "aa""aaa""aaaa"

4. 特殊字符的转义

一些字符在正则表达式中有特殊含义(如 .*?+ 等),如果要匹配这些字符本身,需要使用反斜杠 \ 进行转义。

例如:

  • 要匹配 ".",你需要使用 \.
  • 要匹配 "*",你需要使用 \*

 代码示例:

 String regex = "[1-9]\\d{16}[\\dxX]";
        String s = "43122320050430012x";
        System.out.println(s.matches(regex));

总结:

 

5. 正则表达式的常用方法

  • 匹配:使用 PatternMatcher 类进行匹配。

    Pattern p= Pattern.compile("\\d+"); 
    Matcher m = p.matcher("123abc456");
    boolean matches = m.matches();
  • 查找:使用 find() 方法查找下一个匹配。

    while (matcher.find()) { 
        System.out.println(matcher.group()); 
    }
  • 替换:使用 replaceAll() 方法进行替换。

    String result = matcher.replaceAll("X");
  • 分割:使用 split() 方法按正则表达式分割字符串。

    String[] parts = pattern.split("one1two2three3");
package reptile;

public class Test3 {
    public static void main(String[] args) {
        /*有一段字符串:小诗诗dqwefqwfqwfwg12312小丹丹dqwefqwfqwfwg12312小惠惠
        要求1:把字符串中三个姓名之间的字母替换为vs
        要求2:把字符串中的三个姓名切割出来
         */
        String s="小诗诗dqwefqwfqwfwg12312小月月dqwefqwfqwfwg12312小惠惠";
        //细节:
        //方法在底层跟之前一样也会创建文本解析器的对象
        // 然后从头开始去读取字符串中的内容,只要有满足的,那么就用第二个参数去替换。
         String resut1 = s.replaceAll("[\\w&&[^ ]]+","vs");
         System.out.println(resut1);
        String[]arr =s.split("[\\w&&[^_]]+");
        for(int i=0;i<arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

 6. 正则表达式的分组

捕获分组:
package reptile;

public class Test{
    public static void main(String[] args) {

        //需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符
        // 举例:a123a     b456b   17891   &abc&   a123b(false)
        // \\组号: 表示把第x组的内容再出来用一次
         String regex1="(.).+\\1";
         System.out.println("a123a".matches(regex1));
         System.out.println("b456b".matches(regex1));
         System.out.println("17891".matches(regex1));
         System.out.println("&abc&".matches(regex1));
         System.out.println("a123b".matches(regex1));

        //需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符
        //举例:abc123abc     b456b   123789123    &!@abc&!@   abc123abd(false)
        String regex2="(.+).+\\1";
        System.out.println("abc123abc".matches(regex2));
        System.out.println("b456b".matches(regex2));
        System.out.println("123789123".matches(regex2));
        System.out.println("&!@abc&!@".matches(regex2));
        System.out.println("abc123abd".matches(regex2));

        //需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致
        //举例:aaa123aaa  bbb456bbb   111789111   &&abc&&
        //(.):把首字母看做一组
        //\\2:把首字母拿出来再次使用
        //*:作用于\\2,表示后面重复的内容出现0次或多次
        String regex3="((.)\\2*).+\\1";
        System.out.println("aaa123aaa".matches(regex3));
        System.out.println("bbb456bbb".matches(regex3));
        System.out.println("111789111".matches(regex3));
        System.out.println("&&abc&&".matches(regex3));
        System.out.println("aaa123aab".matches(regex3));
    }
}
后续如何继续使用本组的数据?


正则内部使用:\组号
正则外部使用:$组号 

非捕获分组:

package reptile;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test2 {
    public static void main(String[] args) {
        // 条件爬取
           /*  需求1:爬取版本号为8,11,17的Java文本,但是只要Java,不显示版本号。
                需求2:爬取版本号为8,11,17的]ava文本。正确爬取结果为:java8 Java11 Java17 Java17
                需求3:爬取除了版本号为8,11,17的Java文本,

            */
        String s="java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和JAva11," +
                "因为这两个是长期支持版本,下一个长期支持版本是JAVa17,相信在未来不久JAVA17也会遂渐登上历史舞台";
        //1.定义正则表达式
        //?理解为前面的数据Java
        //=表示在Java后面要跟随的数据
        //但是在获取的时候,只获取前半部分
        // 需求1:
        String regex1="((?i)Java)(?=8|11|17)";
        //需求2:
        // ?i表示忽略大小写
        String regex2="((?i)Java)(8|11|17)";
        // ?理解为前面的数据Java
        // 加上后面的数字就需要用:
        String regex3="((?i)Java)(?:8|11|17)";

        //需求3:
        // ?理解为前面的数据Java,!表示去除后面的数字
        String regex4="((?i)Java)(?!8|11|17)";
        Pattern p=Pattern.compile(regex3);
        Matcher m=p.matcher(s);
        while(m.find()){
            System.out.println(m.group());
        }
    }
}

总结:

爬虫:

带条件爬取:

带条件爬取是指在爬虫过程中只提取符合特定条件的数据。条件可以基于正则表达式的匹配规则或其他逻辑条件。

package reptile;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        String s = " 来黑马称序员学习Java" +
                "电话:18512516758,18512508907" +
                "或者联系邮箱:boniu@itcast.cn," +
                "座机电话:01036517895,010-98951256"+
                "邮箱:bozai@itcast.cn,"+
                "热线电话:400-618-9090,400-618-4000,4006184000,4006189090";

        /*
        手机号的正则表达式:1[3-9]\d{9}
        箱的正则表达式:\w+@[\w&&[^_]]{2,6}(\.[a-zA-Z]{2,3}){1,2}
        座机电话的正则表达式:0\d{2,3}-?[1-9]\d{4,9}
        热线电话的正则表达式:400-?[1-9]\\d{2}-?[1-9]\\d{3}
         */

        String regex = "(1[3-9]\\d{9})|" +
                "(0\\d{2,3}-?[1-9]\\d{4,9})|" +
                "(\\w+@[\\w&&[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2})|" +
                "(400-?[1-9]\\\\d{2}-?[1-9]\\\\d{3})";

        // 获取正则表达式的对象,相当于规则
        Pattern p = Pattern.compile(regex);

        // 获取文本匹配器的对象
        // 利用m去读取s,会按照p的规则找里面的小串
        Matcher m = p.matcher(s);

        //利用循环获取每一个数据
        // m.find()会返回boolean类型,true表示找到符合规则的小串,否则没有符合的小串,停止循环
        // m.find()会标记符合规则的起始索引,结束索引+1,可以通过m.group()找到
        while(m.find()){
            System.out.println(m.group());
        }
    }
}

贪婪爬取和非贪婪爬取:

只写+和*表示贪婪匹配
+?非贪婪匹配
*?非贪婪匹配

贪婪爬取:在爬取数据的时候尽可能的多获取数据

非贪婪爬取:在爬取数据的时候尽可能的少获取数据
对于正则表达式为ab+:
贪婪爬取:abbbbbbbbbbbb。非贪婪爬取:ab
Java当中,默认的就是贪婪爬取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task04 RAG模型 人话八股文Bakwaan_Buddy项目创空间部署

【Datawhale AI夏令营第四期】 魔搭-大模型应用开发方向笔记 Task04 RAG模型 人话八股文Bakwaan_Buddy项目创空间部署 什么是RAG&#xff1a; 我能把这个过程理解为Kimi.ai每次都能列出的一大堆网页参考资料吗&#xff1f;Kimi学了这些资料以后&#xff0c;根据这里面的信息综…

期权有指定的交易场所吗?

在当前的金融市场环境下&#xff0c;设立专门的股票期权交易所&#xff0c;比如上交所&#xff0c;深交所和中金所&#xff0c;都是国内出门的交易场所&#xff0c;不过期权交易都是在券商和期货开通账户买卖&#xff0c;但这并不妨碍投资者通过其他途径参与期权投资&#xff0…

DHCP原理及实验

目录 1.基础知识 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;DHCP优点 2.工作原理 3.私接路由器解决方法 4.实验搭建 &#xff08;1&#xff09;实验top &#xff08;2&#xff09;实验概述 5.配置命令 &#xff08;1&#xff09;基础配置 &#…

音境剧场:开启声学体验的全新纪元—轻空间

在现代建筑和空间设计中&#xff0c;声学环境越来越受到重视。一个好的声学空间&#xff0c;不仅能提升使用者的感受&#xff0c;还能为各种活动提供最优质的音效体验。作为创新声学空间的代表作&#xff0c;“音境剧场”应运而生&#xff0c;它不仅是一个多功能场馆&#xff0…

FunHPC算力平台评测

作为内测老用户&#xff0c;已经用DeepLn平台&#xff08;现改名为FunHPC平台&#xff09;好久了&#xff0c;一路见证了平台从最初100多人的小群到现在满群的状态&#xff0c;FunHpc平台确实在一步步的走向成熟&#xff0c;一步步的变大。趁着现在活动的时间&#xff0c;发篇文…

ant design pro 中用户的表单如何控制多个角色

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二ant design pro access.ts 是如何控制多角色的权限的 看上面的图片 当创建或编辑一个用户时&#xff0c;…

vue3里面的组件实例类型(包括原生的html标签类型)

在 通过 ref&#xff08;null&#xff09;获取组件的时候&#xff0c;我们想要为 组件标注组件类型&#xff0c;可以通过 any 类型来进行标注&#xff0c;但是很明显&#xff0c;这些的代码很不优雅&#xff0c;所以我们可以利用 vue3 里面的 InstanceType 来进行类型标注 这是…

基于STM32开发的智能窗帘控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化光照检测与窗帘控制手动控制与状态指示Wi-Fi通信与远程控制应用场景 家庭智能窗帘办公室环境控制常见问题及解决方案 常见问题解决方案结论 1. 引言 智能窗帘控制系统通过集成光照…

去中心的投票平台

项目介绍&#xff1a; 前端&#xff1a; vue3vant4 工具&#xff1a; vscode和vant在线平台&#xff1a;Vant - Mobile UI Components 交互&#xff1a; Web3.js库 工具&#xff1a;小狐狸钱包&#xff08;MetaMask&#xff09; 后端&#xff1a; solisity 工具&#xff1…

Java并发必杀技!线程池让你的程序速度飙升不止一点点!

文章目录 1 线程池的工作机制是什么&#xff1f;2 线程池的任务出现异常该怎么解决&#xff1f;3 线程池的内存泄露该如何解决&#xff1f; 近期迷上了举例子来结合知识点学习&#xff0c;尽量减少枯燥&#xff0c;如有错见谅哈~ 1 线程池的工作机制是什么&#xff1f; 线程池…

登录方式(c语言)

1.//描述 //有个软件系统登录的用户名和密码为&#xff08;用户名&#xff1a;admin&#xff0c;密码&#xff1a;admin&#xff09;&#xff0c;用户输入用户名和密码&#xff0c;判断是否登录成功。 //输入描述&#xff1a; //多组测试数据&#xff0c;每行有两个用空格分开的…

Java语言程序设计——篇十五(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

K8s节点状态 NotReady排查

k8s节点由 Ready变成 NotReady izbp12ghzy6koox6fqt0suz NotReady slave 97d v1.23.3 izbp12ghzy6koox6fqt0svz Ready control-plane,master 98d v1.23.3节点进入 NotReady 状态可能是由于多种原因引起的&#xff0c;尤其是在资源过量分配&am…

CSS+JS实现一个鼠标移动的高亮边框效果

一、过程分析 先上效果&#xff1a; 在Windows系统里有一个很棒的细节效果&#xff0c;元素的渐变高亮边框是可以感知鼠标的&#xff0c;边框的高亮部分会跟随鼠标的移动而移动。 这种效果也是比较常见的&#xff0c;但是实现起来还是需要一点时间和思路的。 首先&#xff0…

花裤衩 vue 前后端登录

从官网复制地址, idea中打开打开后输入 npm i 编译下载修改配置 找到 vue.config.js打开后,找到第39行 删除代码, 把可粘贴粘上 可粘贴: proxy: { [process.env.VUE_APP_BASE_API]: { target: http://127.0.0.1:18080, changeOrigin: true, pathRewrite…

使用托管竞价实例在Amazon SageMaker上运行机器学习训练

这是本系列文章的第二篇&#xff0c;旨在通过动手实践&#xff0c;帮助大家学习亚马逊云科技的生成式AI相关技能。通过这些文章&#xff0c;大家将掌握如何利用亚马逊云科技的各类服务来应用AI技术。 那么让我们开始今天的内容吧&#xff01; 介绍 什么是Amazon SageMaker …

ant design pro access.ts 是如何控制多角色的权限的

ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant design 的 tree 如何作为角色中的权限选择之一ant design 的 tree 如何作为角色中的权限选择之二 看上面的图片&#xff0c;在前端中如何控制这些权限&#xff0c;比如控制按钮的显示&#xff0c;还有菜单…

Stable diffusion模型分几种?一文详解,入门必看!

在Stable Diffusion中&#xff0c;模型并不只有一种&#xff0c;不同插件有不同的模型&#xff0c;分别作用于不同的功能。今天就带大家一起来学习一下&#xff5e; 01 大模型 也就是stable diffusion模型&#xff0c;在默认界面中&#xff0c;它位于web页面的左上角&#x…

[数据结构] RBTree 模拟实现RBTree

标题&#xff1a;[数据结构] RBTree && 模拟实现RBTree 水墨不写bug 目录 一、红黑树的概念 二、map和set的封装 三、红黑树的实现 1、红黑树节点的定义 2、红黑树的结构 3、红黑树的插入 1.名称 2.插入节点的颜色 红黑树的insert 实现 情况一&#xff1a;不…

微信自动化管理了解下

微信作为一款广泛使用的社交软件&#xff0c;已经成为人们日常生活中不可或缺的通讯工具。不仅个人用户频繁使用&#xff0c;许多企业也依赖微信进行业务沟通和客户服务。 然而&#xff0c;对于企业用户来说&#xff0c;管理多个微信账户往往带来诸多繁琐和不便之处。这些问题…