由浅到深认识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):阶段性练习

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于nodejs+vue高校自习室预约系统的设计与实现python-flask-django-php

本系统在设计过程中,很好地发挥了该开发方式的优势,让实现代码有了良好的可读性,而且使代码的更新和维护更加的方便,操作简单,对以后的维护减少了很多麻烦。系统的顺利开发和实现,对于高校自习室预约这一方…

springboot项目学习-瑞吉外卖(4)

1.任务 这一节主要的任务是解决文件的上传和下载功能 2.文件上传 概念:将本地的图片上传到浏览器上面 点击文件上传,前端就会发送如上的请求,服务端应该根据URL和请求方法来处理请求 CommonController类: RestController Slf4j …

xcode生成静态库.a

一、生成静态库 1.打开 Xcode 创建一个新的 Static Library 工程,取名applestudio 2.创建工程完毕后,简化目录结构 删除系统自动创建的同名类:applestudio.h和applestudio.m 把自己的代码复制进去,如例子:guiconnect.h…

java Web餐馆订单管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 餐馆订单管理系统是一套完善的web设计系统,对理解JSP java 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使…

Elasticsearch从入门到精通-07ES底层原理学习

Elasticsearch从入门到精通-07ES底层原理和高级功能 👏作者简介:大家好,我是程序员行走的鱼 📖 本篇主要介绍和大家一块学习一下ES底层原理包括集群原理、路由原理、分配控制、分配原理、文档分析原理、文档并发安全原理以及一些高…

交换机高级-端口安全

端口安全 1、一旦接口开启端口安全功能,那么接口所学到的动态MAC就会转换成安全MAC地址; 2、安全MAC地址默认情况下只能学习1个,可以通过命令手动修改学习数量; 3、安全MAC地址没有老化时间(但是依然存在内存中&…

iOS-UIFont 实现三方字体的下载和使用

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS-UIFont 实现三方字体的下载和使用 前言 在上一章我们完成啦如何加载使用本地的字体。如果我们有很多的字体可供用户选择,我们当然可以全部使用本地字体加载方式,可是这样就增加了…

荟萃分析R Meta-Analyses 3 Effect Sizes

总结 效应量是荟萃分析的基石。为了进行荟萃分析,我们至少需要估计效应大小及其标准误差。 效应大小的标准误差代表研究对效应估计的精确程度。荟萃分析以更高的精度和更高的权重给出效应量,因为它们可以更好地估计真实效应。 我们可以在荟萃分析中使用…

容器镜像加速指南:探索 Kubernetes 缓存最佳实践

介绍 将容器化应用程序部署到 Kubernetes 集群时,由于从 registry 中提取必要的容器镜像需要时间,因此可能会出现延迟。在应用程序需要横向扩展或处理高速实时数据的情况下,这种延迟尤其容易造成问题。幸运的是,有几种工具和策略…

360奇酷刷机 360刷机助手 QGDP360手机QGDP刷机

360奇酷刷机 360刷机助手 QGDP破解版360手机QGDP刷机 360手机刷机资源下载链接:360rom.github.io 参考:360手机-360刷机360刷机包twrp、root 360奇酷刷机:360高通驱动安装 360手机刷机驱动;手机内置,可通过USB文件传输…

同城上门按摩服务平台,同城上门小程序搭建有具备哪些功能?

上门服务小程序系统通常包含以下功能: 1.用户注册和登录:用户可以在小程序中注册账号并登录,方便后续的预约和服务操作。 2.服务分类和展示:提供各种上门服务的分类,例如家政服务、保洁服务、维…

ChatGPT助力论文写作:详细步骤解析

前言 在论文写作过程中,尽管人工智能工具如ChatGPT能为我们提供有效的辅助,但我们必须铭记,这些工具并不能完全取代我们的思考与判断能力。本指南将详尽地展示如何利用ChatGPT辅助论文写作的全过程,旨在帮助您更高效地完成学术任…

JavaEE企业开发新技术3

目录 2.11 Method的基本操作-1 文字性概念描述 代码: 2.12 Method的基本操作-2 2.13 Method的基本操作-3 2.14 数组的反射操作-1 文字性概念: 代码: 2.15 数组的反射操作-2 学习内容 2.11 Method的基本操作-1 文字性概念描述 Me…

.NET分布式Orleans - 2 - Grain的通信原理与定义

Grain 是 Orleans 框架中的基本单元,代表了应用程序中的一个实体或者一个计算单元。 每个Silo都是一个独立的进程,Silo负责加载、管理和执行Grain实例,并处理来自客户端的请求以及与其他Silo之间的通信。 通信原理 在相同的Silo中&#xff0…

【数据结构】顺序表的定义

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:数据结构 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

vscode下c++的boost库安装

Boost Downloadshttps://www.boost.org/users/download/下载最新的库文件。在shell中,使用命令bootstrap.bat gcc生成b2.exe文件。然后是.\b2.exe toolsetgcc生成库文件,在stage\lib文件夹下把stage\lib文件夹中的库文件拷贝到mingw64\x86_64-w64-mingw3…

小程序从入门到入坑:事件系统

前言 哈喽大家好,我是 SuperYing,本文是小程序从入门到入坑系列的第 3 篇,将比较详尽的讲解 小程序事件系统 的相关知识点,欢迎小伙伴阅读。 读完本文您将收获: 了解小程序事件及基础使用。了解小程序事件分类及多种的…

我们是如何在 IDE 中设计 AutoDev 的 AI 编程开发智能体语言与框架?

上周微软发布了自家的 AI 编程和软件开发智能体框架:AutoDev,其与我们开发的 IDE 插件 AutoDev 有颇多的相似之处,特别是一些设计思路,以及在对于辅助软件开发任务的智能体以及一些基础设施上。 稍有不同的是: 交互介质…

【YOLOV5 入门】——环境配置(Miniconda/Pytorch/YOLOv5/PYPI镜像源)

声明:笔记是毕设时根据B站博主视频学习时自己编写,请勿随意转载! 计划: 入门篇:环境安装、模型检测、构建自定义数据集、训练数据集、可视化界面搭建、Web系统搭建。拓展篇:使用服务器训练、使用pycharm和…

LeetCode第2583题

难度:中等 给你一棵二叉树的根节点 root 和一个正整数 k 。树中的层和是指同一层上节点值的总和。返回树中第 k 大的层和(不一定不同)。如果树少于 k 层,则返回 -1 。注意,如果两个节点与根节点的距离相同,…