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

news2024/11/14 21:30:40

该文章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.coloradmin.cn/o/1545183.html

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

相关文章

相机显示储存卡未格式化怎么回事?怎么办

在摄影的学习和实践中,相机是我们记录美好瞬间的得力助手。然而,当相机突然提示储存卡未格式化时,这往往会让我们感到困惑和焦虑。本文将探讨相机显示储存卡未格式化的可能原因,并提供相应的解决方案。 图片来源于网络&#xff0c…

腾讯云优惠券获取方式及领取入口详解

随着云计算的普及,腾讯云作为国内领先的云计算服务提供商,受到了越来越多企业和个人的青睐。为了降低用户的使用成本,腾讯云推出了各种优惠券,让用户在享受优质服务的同时,还能获得更多实惠。本文将为大家详细介绍腾讯…

微服务(基础篇-004-Feign)

目录 http客户端Feign Feign替代RestTemplate(1) Feign的介绍(1.1) 使用Feign的步骤(1.2) 自定义配置(2) 配置Feign日志的两种方式(2.1) Feign使用优化…

AI预测福彩3D第18弹【2024年3月26日预测--第4套算法重新开始计算第4次测试】

昨天对第4套算法进行了第三次测试,其中第一套方案成功命中,目前第4套算法的预测战绩为3次测试2次命中。测试的目的主要是为了记录统计两套方案的稳定性和命中率。今天继续对第4套算法进行测试,今天是第4次测试,同样测试两个方案。…

【新手小白教程】2024最新:如何轻松订阅Patreon及其支付、充值全攻略

前言 什么是Patreon Patreon是一个极具创新性的在线平台,它为内容创作者提供了一个独特的机会,使他们能够直接通过订阅服务模式从粉丝那里获得资金支持或打赏。 这个平台吸引了各种类型的创作者,包括艺术家、音乐家、作家、视频制作人等&…

免费redis可视化工具windows/mac都可以使用,开源免费

官方地址:RedisInsight | The Best Redis GUI github开源地址:GitHub - RedisInsight/RedisDesktopManager Redis Desktop Manager – Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具。 官方下载方式 滚动到页面底…

Win11文件右键菜单栏完整显示教程

近日公司电脑升级了win11,发现了一个小麻烦事,如下图: 当我想使用svn或git的时候必须要多点一下,这忍不了,无形之中加大了工作量! 于是,菜单全显示教程如下: 第一步:管…

力扣热门算法题 102. 二叉树的层序遍历,104. 二叉树的最大深度,110. 平衡二叉树

102. 二叉树的层序遍历,104. 二叉树的最大深度,110. 平衡二叉树,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.25 可通过leetcode所有测试用例。 目录 102. 二叉树的层序遍历 解题思路 完整代码 Jav…

Spark基于DPU Snappy压缩算法的异构加速方案

一、总体介绍 1.1 背景介绍 Apache Spark是专为大规模数据计算而设计的快速通用的计算引擎,是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些不同之处使 Spark 在某些工作负载方面表现得更加优越。换句话说&am…

项目风险管理:从识别到应对

在项目启动阶段,应制定风险管理计划;在项目执行阶段,应定期进行风险审查和评估;在项目收尾阶段,应对风险管理进行总结和反思。 如何减少和规避风险? 我们可以学习和借鉴类似项目的经验,了解过…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果 一、简单介绍 二、简单图像浮雕效果实现原理 三、简单图像浮雕效果案例实现简单步骤 四、注…

2015年认证杯SPSSPRO杯数学建模D题(第一阶段)城市公共自行车全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 D题 城市公共自行车 原题再现: 城市交通问题直接影响市民的生活和工作。在地形平坦的城市,公共自行车出行系统是一种很好的辅助手段。一般来说,公共自行车出行系统由数据中心、驻车站点、驻车桩、自行车&…

数据本地性如何助力企业在云上实现高效机器学习

分享嘉宾: Lu Qiu, Shawn Sun 本文将讨论数据本地性对于在云上进行高效机器学习的重要性。首先对比现有解决方案的利弊,并综合考虑如何通过数据本地性来降低成本和实现性能最大化。其次会介绍新一代的Alluxio设计与实现,详细说明其在模型训练…

生命源集团2024全球品牌发布会成功举办

生命源集团2024全球品牌发布会圆满落幕 3月20日,生命源集团在杭州隆重举办了主题为“生命源启,荣耀之巅”的2024全球品牌发布会。 活动伊始,嘉宾们陆续签到入场,现场气氛热烈而庄重。随后,生命源集团十二大事业部总裁…

3.3 数据定义 数据库与系统概论

目录 3.3.1 模式的定义与删除 1. 定义模式 2. 删除模式 CASCADE(级联) RESTRICT(限制) 3.3.2 基本表的定义、删除与修改 表的定义 2.数据类型 3. 模式与表 4. 修改基本表 5. 删除基本表 3.3.3 索引的建立与删除 1. …

ZYNQ学习之Ubuntu系统的简单设置与文本编辑

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Ubuntu的简单操作 1.1 切换拼音输入法 Ubuntu 自带的拼音输入法&#xff0c;有两种…

[NKCTF 2024]web解析

文章目录 my first cms全世界最简单的CTF解法一解法二 my first cms 打开题目在最下面发现是CMS Made Simple&#xff0c;版本为2.2.19 扫一下发现存在后台登陆界面&#xff0c;直接访问 用字典爆破下admin的密码为Admin123 然后直接登录&#xff0c;去漏洞库搜一下其实存在…

从人工智能入门到理解ChatGPT的原理与架构的第一天(First)(含机器学习特征工程详解)

目录 一.ChatGPT的发展历程 二.Attention is all you need 三.对于GPT-4的智能水平评估 四.大语言模型的技术演化 1.从符号主义到连接主义 2.特征工程 2.1数据探索 2.2数据清洗 2.3数据预处理 2.3.1无量纲化 2.3.1.1标准化 2.3.1.2区间缩放法 2.3.1.3标准化与归一…

layui框架实战案例(25):laydate中mark的数据后端生成

mark&#xff0c;自定义日期标记。该属性是对 calendar 属性的进一步延伸&#xff0c;灵活度更高。属性可批量设置多个日期标记&#xff0c;如&#xff1a; mark: {0-10-14: 生日, //每年每月的某一天0-0-10: 工资, // 每月 10 号2008-8-8: 开幕, // 指定的日期 }其中日期的格式…

剧变:人类社会与国家危机的转折点 - 三余书屋 3ysw.net

精读文稿 今天我们解读的这本书是《巨变》。副标题是人类社会与国家危机的转折点&#xff0c;这是一个充满风险和危机的时代。比如作为个人&#xff0c;我们可能会遭遇失业、离婚、亲朋好友的意外去世。作为国家&#xff0c;会遭遇经济危机、社会动荡甚至战争。整个世界也会陷入…