由浅到深认识Java语言(25):正则表达式

该文章Github地址:https://github.com/AntonyCheng/java-notes

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识Java语言(24):Date类

37.正则表达式

定义:

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

作用:

正则表达式能够快速匹配字符串,得到一个结果,例如手机号码格式正确与否,身份证号格式正确与否,邮箱格式正确与否等;

完事万物皆对象:

所以正则表达式也是一个对象—— Pattern

Pattern类

正则表达式的编译表示形式。

指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。

示例如下:

匹配十一位手机号码:

package top.sharehome.Bag;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Demo {public static void main(String[] args) {Pattern p = Pattern.compile("\\d{11}");//书写规则String desString = "17388888888";Matcher matcher = p.matcher(desString);//返回一个匹配器boolean matches = matcher.matches();//返回匹配结果System.out.println(matches);}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Pattern字段

字段摘要
static intCANON_EQ 启用规范等价。
static intCASE_INSENSITIVE 启用不区分大小写的匹配。
static intCOMMENTS 模式中允许空白和注释。
static intDOTALL 启用 dotall 模式。
static intLITERAL 启用模式的字面值解析。
static intMULTILINE 启用多行模式。
static intUNICODE_CASE 启用 Unicode 感知的大小写折叠。
static intUNIX_LINES 启用 Unix 行模式。

Pattern方法

返回类型方法解释
static Patterncompile(String regex) 将给定的正则表达式编译到模式中。
static Patterncompile(String regex, int flags) 将给定的正则表达式编译到具有给定标志的模式中。
intflags() 返回此模式的匹配标志。
Matchermatcher(CharSequence input) 创建匹配给定输入与此模式的匹配器。
static booleanmatches(String regex, CharSequence input) 编译给定正则表达式并尝试将给定输入与其匹配。
Stringpattern() 返回在其中编译过此模式的正则表达式。
static Stringquote(String s) 返回指定 String 的字面值模式 String
String[]split(CharSequence input) 围绕此模式的匹配拆分给定输入序列。
String[]split(CharSequence input, int limit) 围绕此模式的匹配拆分给定输入序列。
StringtoString() 返回此模式的字符串表示形式。

正则表达式匹配套路

套路一:

  1. 获得一个装着指定正则表达式的 Pattern 对象;
  2. 将待匹配字符串装入 pattern 对象的 matcher 方法中,获得一个匹配器;
  3. 执行匹配器的 matches() 方法,获得匹配结果;

示例如下:

package top.sharehome.Bag;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Demo {public static void main(String[] args) {Pattern p = Pattern.compile("abc");Matcher matcher = p.matcher("abc");boolean matches = matcher.matches();System.out.println(matches);}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

套路二:

通过 Pattern 的静态方法 matches 方法直接匹配正则表达式和目标字符串,并获得结果;

示例如下:

package top.sharehome.Bag;import java.util.regex.Pattern;public class Demo {public static void main(String[] args) {boolean matches = Pattern.matches( "abc" , "abc");System.out.println(matches);}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

套路三:

通过字符串自带的 matches() 方法直接匹配正则表达式和目标字符串,并获得结果;

package top.sharehome.Bag;import java.util.regex.Pattern;public class Demo {public static void main(String[] args) {boolean matches = "abc".matches("abc");System.out.println(matches);}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正则表达式的书写

字符内容

  • "." 表示一个任意字符,如字符串长度为 n,则表达为 ".{n}"

    示例如下:

    package top.sharehome.Bag;public class Demo {public static void main(String[] args) {boolean matches = "aaa123...".matches(".{9}");System.out.println(matches);}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • "\\d" 表示一个数字字符,如字符串长度为 n ,则表达为 "\\d{n}"

    "\\D" 表示一个非数字字符,如字符串长度为 n ,则表达为 "\\D{n}"

    示例如下:

    package top.sharehome.Bag;public class Demo {public static void main(String[] args) {boolean matches1 = "123456789".matches("\\d{9}");boolean matches2 = "abcdefghi".matches("\\D{9}");System.out.println(matches1);System.out.println(matches2);}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • "\\s" 表示一个空白字符,如字符串长度为 n ,则表达为 "\\s{n}"

    "\\S" 表示一个非空白字符,如字符串长度为 n ,则表达为 "\\S{n}"

    示例如下“

    package top.sharehome.Bag;public class Demo {public static void main(String[] args) {boolean matches1 = "         ".matches("\\s{9}");boolean matches2 = "abcdefghi".matches("\\S{9}");System.out.println(matches1);System.out.println(matches2);}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • "\\w" 表示一个单词字符,如字符串长度为 n ,则表达为 "\\w{n}"

    "\\W" 表示一个非单词字符,如字符串长度为 n ,则表达为 "\\W{n}"

    单词字符范围a~z , A~Z , _ , 0~9

    示例如下:

    package top.sharehome.Bag;public class Demo {public static void main(String[] args) {boolean matches1 = "abcdefghi".matches("\\w{9}");boolean matches2 = "+++===---".matches("\\W{9}");System.out.println(matches1);System.out.println(matches2);}
    }
    

    打印效果如下:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • a (以a为例)表示字符 a 本身,abc (以abc为例)表示字符串 abc 本身;

    示例如下:

    package top.sharehome.Bag;public class Demo {public static void main(String[] args) {boolean matches1 = "abcdefghi".matches("abcdefghi");boolean matches2 = "123456789".matches("123456789");System.out.println(matches1);System.out.println(matches2);}
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

字符类

"[abc]" (以 abc 为例)表示 abc 之中的某一个;

"[^abc]" (以 abc 为例)表示非 abc 之中的某一个;

"[a-zA-Z]" 表示azAZ 中的某一个,两头的字母包括在内(范围)

"[a-d[m-p]]" 表示admp 中的某一个,也可写作 [a-dm-p](并集)

"[a-z&&[def]]" 表示 def 中的某一个(交集)

"[a-z&&[^bc]]" 表示 az,除了 bc 中的某一个:[ad-z](减去)

"[a-z&&[^m-p]]" 表示 az,而非 mp 中的某一个:[a-lq-z](减去)

示例如下:

package top.sharehome.Bag;public class Demo {public static void main(String[] args) {boolean matches1 = "a".matches("[abc]");boolean matches2 = "d".matches("[^abc]");boolean matches3 = "y".matches("[a-zA-Z]");boolean matches4 = "n".matches("[a-d[m-p]]");boolean matches5 = "e".matches("[a-z&&[def]]");boolean matches6 = "d".matches("[a-z&&[^bc]]");boolean matches7 = "l".matches("[a-z&&[^m-p]]");System.out.println(matches1);System.out.println(matches2);System.out.println(matches3);System.out.println(matches4);System.out.println(matches5);System.out.println(matches6);System.out.println(matches7);}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

字符数量

"内容{3}" 表示内容正好出现 3 次;

"内容{3,5}" 表示内容出现 3 到 5 次;

"内容{3,}" 表示内容至少出现 3 次;

"内容1{3}内容2{4}内容3{5}" 表示内容 1 出现 3 次且内容 2 出现 4 次且内容3 出现 5 次;

"内容?" 表示内容出现零次或一次;

"内容" 表示内容出现零次或多次;*

“内容+” 表示内容出现一次或多次;

示例如下:

package top.sharehome.Bag;public class Demo {public static void main(String[] args) {boolean matches1 = "aaa".matches("a{3}");boolean matches2 = "aaaa".matches("a{3,5}");boolean matches3 = "aaaaaa".matches("a{3,}");boolean matches4 = "aaabbbbccccc".matches("a{3}b{4}c{5}");boolean matches5 = "".matches("a?");boolean matches6 = "aaaa".matches("a*");boolean matches7 = "a".matches("a+");System.out.println(matches1);System.out.println(matches2);System.out.println(matches3);System.out.println(matches4);System.out.println(matches5);System.out.println(matches6);System.out.println(matches7);}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

边界匹配器

^首字符 匹配行的开头位置,所以得写在第一位;

尾字符$ 匹配行的结尾位置,所以得写在最后一位;

\\b 匹配单词位置;

\\B 匹配非单词边界位置;

\\A 匹配输入的开头位置;

\\G 匹配上一个匹配的结尾位置;

\\Z 匹配输入的结尾位置,仅用于最后的结束符(如果有的话);

\\z 匹配输入的结尾位置;

示例如下:

我们来匹配 “I Love You”;

package top.sharehome.Bag;public class Demo {public static void main(String[] args) {String str = "I Love You";boolean matches = str.matches("^I\\b\\s\\b\\w{4}\\b\\s\\b\\w{2}u$");//^I表示该行以I开头,\\b表示I右边界,\\s表示I和L之间的空格,\\b表示Love左边界,\\w{4}表示Love四个单词,\\b表示Love右边界,\\s表示空格,\\b表示You左边界,\\w{2}表示Yo两个单词,\\u$表示该行以u结尾;System.out.println(matches);}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

练习

练习一:

验证输入的电话号码;

package top.sharehome.Bag;import java.util.Scanner;public class Demo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String reg = "^1[3456789]\\d{9}";System.out.println("请输入你的电话号码:");String des = sc.next();if(des.matches(reg)) {System.out.println("输入成功!");}else {System.out.println("输入失败!");}sc.close();}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

练习二:

验证输入的电子邮箱;

邮箱由大写字母开头,后跟10位字符 (数字和字母) ,最后加上 @1900SH.com;

package top.sharehome.Bag;import java.util.Scanner;public class Demo {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String reg = "^[A-Z][a-zA-z0-9]{10}@1900SH.com$";System.out.println("请输入你的电子邮箱:");String des = sc.next();if(des.matches(reg)) {System.out.println("输入成功!");}else {System.out.println("输入失败!");}sc.close();}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

练习三:

练习使用 String 类中的 replaceAll(String regex,String replacement) 方法和 split(String regex) 方法;

package top.sharehome.Bag;import java.util.Arrays;public class Demo {public static void main(String[] args) {String str = "abcdefg123456789asdhfgjkl0987654321";//把 str 的数字替换成 -String replaceAll = str.replaceAll("\\d", "-");System.out.println(replaceAll);//把 str 按照数字进行切割成多个子字符串String[] split = str.split("\\d");System.out.println(Arrays.toString(split));}
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一章:由浅到深认识Java语言(26):阶段性练习

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

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

相关文章

2024 Python3.10 系统入门+进阶(三):Python变量类型和运算符

目录 一、Python变量的定义和使用二、Python整数类型(int)详解三、Python小数/浮点数(float)类型详解四、Python复数类型(complex)详解---了解五、Python字符串详解(包含长字符串和原始字符串)5.1 处理字符串中的引号5.2 字符串的…

后端常见面经之JVM

JVM组成 有垃圾回收的是哪些地方? 垃圾回收主要是针对堆内存中的对象进行的,包括以下几个方面: 堆内存:垃圾回收主要针对堆内存中不再被引用的对象进行回收,包括新生代和老年代中的对象。 永久代/元空间&#xff1a…

Selenium 自动化 —— 切换浏览器窗口

更多内容请关注我的 Selenium 自动化 专栏: 入门和 Hello World 实例使用WebDriverManager自动下载驱动Selenium IDE录制、回放、导出Java源码浏览器窗口操作 平时我们在使用浏览器时,通常会打开多个窗口,然后再多个窗口中来回切换&#xf…

众邦科技CRMEB商城商业版任意文件写入getshell 0day

代码审计 接口:/adminapi/system/crud 处理的代码如下 public function save(SystemCrudDataService $service, $id 0){$data $this->request->postMore([[pid, 0],//上级菜单id[menuName, ],//菜单名[tableName, ],//表名[modelName, ],//模块名称[table…

手机网页视频无水印采集工具|抖音视频关键词批量下载软件

轻松获取手机网页视频无水印的神器!让您随心所欲畅享精彩视频内容! 随着网络视频的盛行,如何方便快捷地获取您感兴趣的视频内容成为一大需求。现推出一款手机网页视频无水印采集工具,功能强大,操作简便,助您…

[项目前置]如何用webbench进行压力测试

测试软件 采用webbench进行服务器性能测试。 Webbench是知名的网站压力测试工具,它是由Lionbridge公司开发。 webbench的标准测试可以向我们展示服务器的两项内容: 每秒钟相应请求数 和 每秒钟传输数据量 webbench测试原理是,创建指定数…

03-CSS盒模型(padding、margin、opactiy、cursor、display、css3前缀)

一、CSS盒模型 CSS 盒模型规定了处理元素内容、内边距、边框 和 外边距 的方式。最内部分是元素内容,直接包围内容的是内边距。内边距呈现了元素的背景。内边距的边缘是边框。边框以外是外边距。 1.元素的尺寸: height 设置元素的高度。属性值:auto&am…

开源流程图表库(01):Mermaid.js生成流程图、时序图、甘特图等

一、Mermaid.js的特点 Mermaid.js是一个用于生成流程图、时序图、甘特图等各种图表的开源库。它使用简洁的文本语法来描述图表结构,并将其转换为可视化的图形。 Mermaid.js的主要特点包括: 简洁易用:Mermaid.js使用简单的文本语法来描述图表…

FPGA电平标准

1.LVTTL:(3.3v) 2.LVCOMS:(1.8v) 3.LVDS(1.8v):LVDS_25(2.5v) 4:如果是ddr3与fpga相连接fpga的vcco推荐(1.5v)…

Qt实现简易的多线程TCP服务器(支持多个客户端连接)附源码

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化,m_widget我们用于后续的显示消息等,说白了就是主界面的更新显示等 …

卡尔曼滤波器_3.3

目标 了解卡尔曼滤波在目标跟踪中的应用知道卡尔曼滤波的原理:预测阶段和更新阶段 卡尔曼滤波器(Kalman Filter)是一种利用线性系统理论和概率统计原理,对含有噪声的动态系统进行状态估计的最优滤波器。它由匈牙利裔美国电气工程…

web前端之3D标签动画、指定范围的随机数、动态设置css变量、文档片段对象、反向动画

MENU 效果图htmlJavaScriptstyle 效果图 html <div class"container"></div>JavaScript // 祝词 var words [健康码常绿,股票飙红,生意兴隆,财源广进,心想事成,永远十八,身体健康,大富大贵,大吉大利,万事如意,美梦成真,吉祥如意,鸿运当头,五福临门,吉…

正式发布:VitePress 1.0 现代化静态站点生成器!

大家好&#xff0c;我是奇兵&#xff0c;今天介绍一下现代化静态站点生成器!&#xff0c;希望能帮到大家。 3 月 21 日&#xff0c; 由 Vue 团队出品的现代化静态站点生成器 VitePress 正式发布 1.0 版本&#xff01;它专为构建快速、以内容为中心的网站而生&#xff0c;能够轻…

Apache Spark

一、Apache Spark 1、Spark简介 Apache Spark是用于大规模数据 (large-scala data) 处理的统一 (unified) 分析引擎。 Spark官网 Spark最早源于一篇论文Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing,该论文是由加州大学柏…

C# 将 Word 转文本存储到数据库并进行管理

目录 前言 1. 创建数据库表格 2. 安装必需的 NuGet 包 3. 转换 Word 文档为文本 4. 将文本存储到数据库 5. 完整示例 前言 C# 是一种通用的编程语言&#xff0c;可以用于开发各种类型的应用程序&#xff0c;包括处理文本和数据库管理。在这篇文章中&#xff0c;我将向您…

问卷调查数据分析指南!掌握方法,精准把握用户需求!

“我们可以用自定义报表、交叉报表、自定义过滤器等放方式进行问卷调查数据分析。“ 问卷调查的过程中&#xff0c;问卷设计、问卷分发、问卷收集可能都不是让我们最头疼的。经过几天的奋战&#xff0c;终于拿到了数据&#xff0c;但是问题也随之而来。收集上来的问卷信息&…

linux操作系统——线程控制+线程封装

1.理解用户级线程 我们前面用到的所有跟线程有关的接口全部都不是系统直接提供的接口&#xff0c;而是原生线程库pthread提供的接口。我们前面谈到了由于用户只认线程&#xff0c;而linux操作系统是通过用轻量级进程模拟线程&#xff0c;并不是真正的线程&#xff0c;所以linu…

C# for/foreach 循环

一个 for 循环是一个允许您编写一个执行特定次数的循环的重复控制结构。 语法 C# 中 for 循环的语法&#xff1a; for ( init; condition; increment ) {statement(s); } 下面是 for 循环的控制流&#xff1a; init 会首先被执行&#xff0c;且只会执行一次。这一步允许您声…

【数据结构】非线性结构——二叉树

文章目录 前言1.树型结构1.1树的概念1.2树的特性1.3树的一些性质1.4树的一些表示形式1.5树的应用2.二叉树 2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的基本操作 前言 前面我们都是学的线性结构的数据结构&#xff0c;接下来我们就需要来学习非…

Stable Diffusion 进阶教程 - 二次开发(制作您的文生图应用)

目录 1. 引言 2. 基于Rest API 开发 2.1 前置条件 2.2 代码实现 2.3 效果演示 2.4 常见错误 3. 总结 1. 引言 Stable Diffusion作为一种强大的文本到图像生成模型&#xff0c;已经在艺术、设计和创意领域引起了广泛的关注和应用。然而&#xff0c;对于许多开发者来说&#xff…