由浅到深认识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.rhkb.cn/news/290340.html

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

相关文章

LabVIEW智能降噪系统

LabVIEW智能降噪系统 随着噪声污染问题的日益严重,寻找有效的降噪技术变得尤为关键。介绍了一种基于LabVIEW平台开发的智能降噪系统,该系统能够实时采集环境噪声,并通过先进的信号处理技术实现主动降噪,从而有效改善生活和工作环…

PHP开发全新29网课交单平台源码修复全开源版本,支持聚合登陆易支付

这是一套最新版本的PHP开发的网课交单平台源代码,已进行全开源修复,支持聚合登录和易支付功能。 项目 地 址 : runruncode.com/php/19721.html 以下是对该套代码的主要更新和修复: 1. 移除了论文编辑功能。 2. 移除了强国接码…

离线linux服务器安装mysql8

本文的服务器环境:openEuler毛坯版的,很多常用的指令都没有预装,比如rpm、tar等等,没有网络坏境,需要自己手动配置本地yum仓库,安装相关指令 1、检查服务器是否已经安装了MySQL 1.1、查询mysql以安装的相关…

MYSQL8.0安装、配置、启动、登入与卸载详细步骤总结

文章目录 一.下载安装包1.方式一.官网下载方式二.网盘下载 二.解压安装三.配置1.添加环境变量 三.验证安装与配置成功四.初始化MYSQL五.注册MySQL服务六.启动与停止MYSQL服务七.修改账户默认密码八.登入MySQL九.卸载MySQL补充:彻底粉碎删除Mysql 一.下载安装包 1.方…

蓝桥杯-卡片换位

solution 有一个测试点没有空格&#xff0c;要特别处理&#xff0c;否则会有一个测试点运行错误&#xff01; 还有输入数据的规模在变&#xff0c;小心顺手敲错了边界条件 #include<iostream> #include<string> #include<queue> #include<map> #incl…

动态规划入门(数字三角形模型)

备战2024年蓝桥杯&算法学习 -- 每日一题 Python大学A组 试题一&#xff1a;摘花生 试题二&#xff1a;最低通行费用 试题三&#xff1a;方格取数 试题四&#xff1a;传纸条 试题一&#xff1a;摘花生 【题目描述】 Hello Kitty想摘点花生送给她喜…

持续集成流水线介绍(CI)

目录 一、概述 二、持续集成的典型操作流程 2.1 概述 2.2 持续集成的操作流程图 2.3 持续集成关键流程说明 三、构建持续集成流水线的方式 3.1 依托云厂商能力 3.2 采用开源产品 3.3 企业自研 四、构建持续化集成流水线 4.1 基于GitHub的持续集成流水线&#xff08;公…

Java毕业设计-基于springboot开发的招聘信息管理系统平台-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、管理员功能模块3、企业后台管理模块4、用户后台管理模块 四、毕设内容和源代码获取总结 Java毕业设计-基于spri…

Tomcat项目创建 以及 在IDEA当中集成Tomcat

一: 有关Tomcat的WEB项目创建 TOMCAT项目的创建有两种方式, 第一种是利用骨架进行创建, 第二种是利用填补进行相应的创建, 不适用骨架进行创建 ,在这里主要聊第二种 (使用IDEA版本为2023) 1. 创建MAVEN项目, 非骨架形式 2.在相应的pom文件当中设置打包方式 为 war包的打包形…

快速上手Spring Cloud 十四:璀璨物联网之路

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

|行业洞察·汽车|《2024新能源汽车行业及营销趋势报告-20页》

报告的主要内容解读&#xff1a; 新能源汽车行业概述及品牌分布&#xff1a; 近年来&#xff0c;中国新能源汽车销量增速高&#xff0c;市场占有率快速提升&#xff0c;成为汽车行业的重要增量。新能源汽车消费者趋向年轻化、女性化和高端化&#xff0c;对高科技、新体验有较高…

获取高德安全码SHA1

高德开发者平台上给的三种方法 获取安全码SHA1&#xff0c;这里我自己使用的是第三种方法。 1、通过Eclipse编译器获取SHA1 使用 adt 22 以上版本&#xff0c;可以在 eclipse 中直接查看。 Windows&#xff1a;依次在 eclipse 中打开 Window -> Preferances -> Androi…

C#手术麻醉信息系统全套商业源码,自主版权,支持二次开发 医院手麻系统源码

手术麻醉信息系统是HIS产品的中的一个组成部分&#xff0c;主要应用于医院的麻醉科&#xff0c;属于电子病历类产品。医院麻醉监护的功能覆盖整个手术与麻醉的全过程&#xff0c;包括手术申请与排班、审批、安排、术前、术中和术后的信息管理提供支持。 手术麻醉信息系统可与EM…

Node爬虫:原理简介

在数字化时代&#xff0c;网络爬虫作为一种自动化收集和分析网络数据的技术&#xff0c;得到了广泛的应用。Node.js&#xff0c;以其异步I/O模型和事件驱动的特性&#xff0c;成为实现高效爬虫的理想选择。然而&#xff0c;爬虫在收集数据时&#xff0c;往往面临着诸如反爬虫机…

编译与链接(想了解编译与链接,那么看这一篇就足够了!)

前言&#xff1a;在我们练习编程的时候&#xff0c;我们只需要将代码写入、运行&#xff0c;就可以得到计算之后的结果了&#xff0c;但是你有没有想过&#xff0c;为什么就可以得到计算之后的结果呢&#xff0c;它的底层又到底是什么呢&#xff1f; ✨✨✨这里是秋刀鱼不做梦的…

​python学习之变量类型​

print单纯输中的十种数据类型只需要用print()函数即可&#xff0c;()里面直接写变量名。 下面重点介绍print格式输出&#xff1a; 第一种方法&#xff1a;一个萝卜一个坑&#xff0c;下面的代码中&#xff0c;{0}、{1}、{2}分别表示j,i,j*i&#xff0c;单引号里面是输出格式。…

postgis已有表插入外部表数据带空间字段和主键

1、postgis已有表 其中gid是主键字段,geom是几何字段 2、待插入表的数据(分三种情况) (1)通过坐标将写入几何类型字段 INSERT INTO test (gid, geom, mc,lng,lat) SELECT (SELECT COALESCE(MAX(gid)<

Linux的学习之路:3、基础指令(2)

一、echo指令 这个指令在上篇文章我也用了但是忘了说了&#xff0c;这个指令的大概用法就是把后面跟的文本等输出在显示器上&#xff0c;如下代码所示打印的“Hello Linux” [rootVM-24-9-centos ~]# echo "Hello Linux" Hello Linux二、输出重定向与输入重定向 着…

面向对象:继承

文章目录 一、什么叫继承&#xff1f;二、单继承三、多继承3.1多继承的各种情况3.1.1一般情况3.1.1特殊情况&#xff08;菱形继承&#xff09; 四、菱形继承引发的问题4.1 问题1:数据冗余4.2 问题2:二义性&#xff08;无法确定到底是访问哪个&#xff09; 五、虚拟继承解决菱形…

vue前端工程化

前言 本文介绍的是有关于vue方面的前端工程化实践&#xff0c;主要通过实践操作让开发人员更好的理解整个前端工程化的流程。 本文通过开发准备阶段、开发阶段和开发完成三个阶段开介绍vue前端工程化的整体过程。 准备阶段 准备阶段我将其分为&#xff1a;框架选择、规范制…