正则表达式

一、正则表达式基本介绍

1. 介绍

一个正则表达式,就是用某种模式去匹配字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用,不过,经过练习后,就觉得这些复杂的表达式写起来还是相当简单的,而且,一旦你弄懂它们,你就能把数小时辛苦而且易错的文本处理工作缩短在几分钟(甚至几秒钟)内完成
 

二、 正则表达式语法

 1. 元字符(Metacharacter)-转义号 

 2. 元字符-字符匹配符

public class RegExp03 {
public static void main(String[] args) {
String content = "a11c8abc _ABCy @";
//String regStr = "[a-z]";//匹配 a-z 之间任意一个字符
//String regStr = "[A-Z]";//匹配 A-Z 之间任意一个字符
//String regStr = "abc";//匹配 abc 字符串[默认区分大小写]
//String regStr = "(?i)abc";//匹配 abc 字符串[不区分大小写]
//String regStr = "[0-9]";//匹配 0-9 之间任意一个字符
//String regStr = "[^a-z]";//匹配 不在 a-z 之间任意一个字符
//String regStr = "[^0-9]";//匹配 不在 0-9 之间任意一个字符
//String regStr = "[abcd]";//匹配 在 abcd 中任意一个字符
//String regStr = "\\D";//匹配 不在 0-9 的任意一个字符
//String regStr = "\\w";//匹配 大小写英文字母, 数字,下划线
//String regStr = "\\W";//匹配 等价于 [^a-zA-Z0-9_]
//\\s 匹配任何空白字符(空格,制表符等)
//String regStr = "\\s";
//\\S 匹配任何非空白字符 ,和\\s 刚好相反
//String regStr = "\\S";
//. 匹配出 \n 之外的所有字符,如果要匹配.本身则需要使用 \\. String regStr = ".";
//说明
//1. 当创建 Pattern 对象时,指定 Pattern.CASE_INSENSITIVE, 表示匹配是不区分字母大小写. Pattern pattern = Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到 " + matcher.group(0));
}
}

3. 元字符-选择匹配符

public static void main(String[] args) {
String content = "hanshunping 韩 寒冷";
String regStr = "han|韩|寒";
Pattern pattern = Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到 " + matcher.group(0));
}
}

4. 元字符-限定符

用于指定其前面的字符和组合项连续出现多少次

 

public static void main(String[] args) {
String content = "a211111aaaaaahello";
//a{3},1{4},\\d{2}
//String regStr = "a{3}";// 表示匹配 aaa
//String regStr = "1{4}";// 表示匹配 1111
//String regStr = "\\d{2}";// 表示匹配 两位的任意数字字符
//a{3,4},1{4,5},\\d{2,5}
//细节:java 匹配默认贪婪匹配,即尽可能匹配多的
//String regStr = "a{3,4}"; //表示匹配 aaa 或者 aaaa
//String regStr = "1{4,5}"; //表示匹配 1111 或者 11111
//String regStr = "\\d{2,5}"; //匹配 2 位数或者 3,4,5
//1+
//String regStr = "1+"; //匹配一个 1 或者多个 1
//String regStr = "\\d+"; //匹配一个数字或者多个数字
//String regStr = "1*"; //匹配 0 个 1 或者多个 1
//演示?的使用, 遵守贪婪匹配
String regStr = "a1?"; //匹配 a 或者 a1
Pattern pattern = Pattern.compile(regStr/*, Pattern.CASE_INSENSITIVE*/);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到 " + matcher.group(0));
}
}

5. 元字符-定位符

 

String content = "hanshunping sphan nnhan";
//String content = "123-abc";
//以至少 1 个数字开头,后接任意个小写字母的字符串
//String regStr = "^[0-9]+[a-z]*";
//以至少 1 个数字开头, 必须以至少一个小写字母结束
//String regStr = "^[0-9]+\\-[a-z]+$";
//表示匹配边界的 han[这里的边界是指:被匹配的字符串最后, // 也可以是空格的子字符串的后面]
//String regStr = "han\\b";
//和\\b 的含义刚刚相反
String regStr = "han\\B";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到=" + matcher.group(0));
}

6. 分组

// 1. matcher.group(0) 得到匹配到的字符串
// 2. matcher.group(1) 得到匹配到的字符串的第 1 个分组内容
// 3. matcher.group(2) 得到匹配到的字符串的第 2 个分组内容
//String regStr = "(\\d\\d)(\\d\\d)";//匹配 4 个数字的字符串
//命名分组: 即可以给分组取名
String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";//匹配 4 个数字的字符串
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到=" + matcher.group(0));
System.out.println("第 1 个分组内容=" + matcher.group(1));
System.out.println("第 1 个分组内容[通过组名]=" + matcher.group("g1"));
System.out.println("第 2 个分组内容=" + matcher.group(2));
System.out.println("第 2 个分组内容[通过组名]=" + matcher.group("g2"));
String content = "hello 韩顺平教育 jack 韩顺平老师 韩顺平同学 hello 韩顺平学生";
// 找到 韩顺平教育 、韩顺平老师、韩顺平同学 子字符串
//String regStr = "韩顺平教育|韩顺平老师|韩顺平同学";
//上面的写法可以等价非捕获分组, 注意:不能 matcher.group(1)
//String regStr = "韩顺平(?:教育|老师|同学)";
//找到 韩顺平 这个关键字,但是要求只是查找韩顺平教育和 韩顺平老师 中包含有的韩顺平
//下面也是非捕获分组,不能使用 matcher.group(1)
//String regStr = "韩顺平(?=教育|老师)";
//找到 韩顺平 这个关键字,但是要求只是查找 不是 (韩顺平教育 和 韩顺平老师) 中包含有的韩顺平
//下面也是非捕获分组,不能使用 matcher.group(1)
String regStr = "韩顺平(?!教育|老师)";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
System.out.println("找到: " + matcher.group(0));

7. 正则表达式三个常用类

 三、分组、捕获、反向引用

1. 介绍

2.  经典的结巴程序

把 类似 : "我....我要....学学学学....编程 java!";
通过正则表达式 修改成 "我要学编程 java"

public class RegExp13 {
public static void main(String[] args) {
String content = "我....我要....学学学学....编程 java!";
//1. 去掉所有的. Pattern pattern = Pattern.compile("\\.");
Matcher matcher = pattern.matcher(content);
content = matcher.replaceAll("");
// System.out.println("content=" + content);
//2. 去掉重复的字 我我要学学学学编程 java!
// 思路
//(1) 使用 (.)\\1+
//(2) 使用 反向引用$1 来替换匹配到的内容
// 注意:因为正则表达式变化,所以需要重置 matcher
// pattern = Pattern.compile("(.)\\1+");//分组的捕获内容记录到$1
// matcher = pattern.matcher(content);
// while (matcher.find()) {
// System.out.println("找到=" + matcher.group(0));
// }
//
// //使用 反向引用$1 来替换匹配到的内容
// content = matcher.replaceAll("$1");
// System.out.println("content=" + content);
//3. 使用一条语句 去掉重复的字 我我要学学学学编程 java!
content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
System.out.println("content=" + content);
}
}

四、String 类中使用正则表达式

1.  替换功能
String 类 public String replaceAll(String regex,String replacement)
2. 判断功能
String 类 public boolean matches(String regex){} //使用 Pattern 和 Matcher 类
3 .分割功能
String 类 public String[] split(String regex)

public class StringReg {
public static void main(String[] args) {
String content = "2000 年 5 月,JDK1.3、JDK1.4 和 J2SE1.3 相继发布,几周后其" +
"获得了 Apple 公司 Mac OS X 的工业标准的支持。2001 年 9 月 24 日,J2EE1.3 发" +
"布。" +
"2002 年 2 月 26 日,J2SE1.4 发布。自此 Java 的计算能力有了大幅提升";
//使用正则表达式方式,将 JDK1.3 和 JDK1.4 替换成 JDK
content = content.replaceAll("JDK1\\.3|JDK1\\.4", "JDK");
System.out.println(content);
//要求 验证一个 手机号, 要求必须是以 138 139 开头的
content = "13888889999";
if (content.matches("1(38|39)\\d{8}")) {
System.out.println("验证成功");
} else {
System.out.println("验证失败");
}

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

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

相关文章

python求解纳什均衡

背景知识 双人纳什均衡求解问题&#xff0c;假设&#xff1a; 玩家 0 0 0&#xff0c;行动 { 0 , ⋯ , m − 1 } \{0, \cdots, m-1\} {0,⋯,m−1}&#xff0c;收益 A ∈ R m n A \in \reals_{}^{m \times n} A∈Rmn​&#xff0c;策略 p ∈ R m 1 p \in \reals_{}^{m \ti…

AA@有理系数多项式@整系数多项式@本原多项式@有理多项式可约问题

文章目录 有理系数多项式本原多项式一般多项式到整系数多项式本原多项式定义高斯引理整系数多项式分解定理推论思路1:思路2:思路3:(废弃) 整系数多项式有理根定理与整根定理爱森斯坦判别法构造任意次数的有理系数不可约多项式 有理系数多项式 有理数域上一元多项式的因式分解.…

Shuffle简单理解

map的结果本身是无序的&#xff0c;但是map输出的结果有序 mapper和reduce是不同的机器&#xff0c;进行了网络传输&#xff0c;所以存在数据拷贝 第二次排序&#xff0c;是将每个reduce对应的task进行排序&#xff0c;然后再进入reduce maptask运行结束&#xff0c;每个mask块…

JS制作一个网页版的猜数字小游戏

一. 网络游戏简介 在输入框内输一个数字&#xff0c;点击后面的“猜”按钮&#xff0c;系统会根据你猜的数字的大小&#xff0c;返回你是猜大猜小还是猜正确&#xff0c;系统还会统计你猜的次数&#xff0c;在猜数字的途中你点击按钮随时可以重新开始游戏 页面框架&#xff1…

能耗管理平台保障用电的安全

安科瑞虞佳豪 壹捌柒陆壹伍玖玖零玖叁 6月12日&#xff0c;江苏盐城射阳县某民房起火&#xff0c;消防救援人员到场后&#xff0c;立即对火势进行扑救&#xff0c;经过20多分钟的处置&#xff0c;现场明火全部被扑灭&#xff0c;据了解&#xff0c;起火原因是电线老化短路引发…

短视频seo抖音矩阵号系统源码开发搭建分享

我们自主研发的短视频矩阵系统源码&#xff0c;技术研发的独立核心算法的视频内容管理和展示功能。无需额外的流量接口费用和复杂的配置&#xff0c;轻松地创建和管理短视频内容&#xff0c;短视频矩阵源码是指将抖音平台上的视频资源进行筛选、排序等操作&#xff0c;进而提升…

Ubuntu 查看磁盘空间大小命令

df命令是Linux系统以磁盘分区为单位查看文件系统&#xff0c;可以加上参数查看磁盘剩余空间信息&#xff0c;命令格式&#xff1a; df -hl 显示格式为&#xff1a;  文件系统 容量 已用 可用 已用% 挂载点  Filesystem Size Used Avail Use% Mou…

48、MyBatis的优缺点

MyBatis的优缺点 优点 基于 SOL 语句编程&#xff0c;相当灵活&#xff0c;不会对应用程序或者数据库的现有设计造成任何影响&#xff0c;SQL 写在 XML里&#xff0c;解除 sql 与程序代码的合&#xff0c;便于统一管理&#xff0c;提供 XML 标签&#xff0c;支持编写动态 SQL…

Redis简介(1)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis简介1、NoSQL1.1、什么是NoSQL&#xff1f;1.2、NoSQL 特点…

【java爬虫】使用selenium获取某宝联盟淘口令

上一篇文章我们已经介绍过使用selenium获取优惠券基本信息的方法 (15条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客 本文将在上一篇文章的基础上更进一步&#xff0c;获取每个优惠券的淘口令&#xff0c;毕竟我们只有复制淘口令才能在APP里面获取优惠…

C++day4 (拷贝构造函数、拷贝赋值函数、匿名对象、友元函数、常成员函数、常对象、运算符重载)

#include <iostream> #include <cstring> using namespace std;class mystring { private:char *str; //记录C风格字符串int size; //记录字符串的实际长度public://无参构造mystring():size(10){strnew char[size];//构造出一个长度为10的字符串strcpy(str,&…

汽车的空气悬架的功能以及发展趋势

空气悬架能实现什么功能以及发展趋势 了解空气悬架之前,首先得快速了解什么是悬架。 教科书说法是: 悬架系统是汽车的车架与车桥或车轮之间的一切传力连接装置的总称。悬架系统基本构成有弹性元件(各类弹簧,缓冲作用);减震元件(减震器,减震作用);导向机构(控制臂等…

《网络是怎样连接的》(一)

本文主要取材于 《网络是怎样连接的》 第一章。 简述&#xff1a;在浏览器输入一个网址&#xff0c;浏览器会解析出域名&#xff0c;但是直接使用域名无法找到Web服务器。需要使用DNS解析器将域名解析为IP地址&#xff0c;然后客户端可以创建套接字&#xff0c;延伸出管道根据…

浅谈设计模式之单例模式

0 单例模式简介 单例模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。单例模式指的是单一的一个类&#xff0c;该类负责创建自己的对象&#xff0c;并且保证该对象唯一。该类提供了一种访问其唯一对象的方法&#xff0c;外部需要调用该类的对象可以通过方法获…

编译报错:The project is using an incompatible version

The project is using an incompatible version (AGP 8.0.2) of the Android Gradle plugin. Latest supported version is AGP 7.4.1 See Android Studio & AGP compatibility options. 注意AndroidStudio版本和AGP的版本&#xff0c;需要对应。 如果不对应需要下载对应的…

python发送邮件zmail库

第三方库“zmail”和“yagmail”可实现邮件发送。在实际使用对比zmail比yagmail更简洁。使用zmail&#xff0c;无需登录OA邮箱&#xff0c;便可完成邮件的发送及附件的自动加载。 import zmaildef send_zmail(sender, sender_password, addressee, host, port465, inspect_smtp…

【EasyExcel】在SpringBoot+VUE项目中引入EasyExcel实现对数据的导出(封装工具类)

在SpringBootVUE项目中引入EasyExcel实现导入导出 一、引入EasyExcel 通过maven引入&#xff0c;坐标如下&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel-core</artifactId><version>3.3.2</version…

R语言ggplot2——折线图

BMI <- read.table(/Users/zhangzhishuai/Downloads/33 lesson33 ggplot2散点图&#xff08;一&#xff09;/33_ggplot2/BMI.txt, header T,sep \t, row.names 1) library(ggplot2) ggplot(BMI, aes(xweight,yheight)) geom_line() # 折线图# 加文字 ggplot(BMI, aes(xwe…

Flink订阅Kafka消息队列实战案例

1、Kafka介绍 Kafka是一款开源的分布式消息系统&#xff0c;最初由LinkedIn公司开发并开源。它被设计用于处理海量的实时数据流&#xff0c;可以支持高吞吐量和低延迟的数据传输。 Kafka的设计主要目标是提供一个持久化的、高吞吐量的、可扩展的、分布式发布/订阅消息系统&am…

PHP客服系统-PhpWorkmanChat客服系统修改管理员密码

作为一款流行的开源PHP客服系统&#xff0c;基于thinkphp和workman&#xff0c;跨平台轻量级客服系统源码 管理员表是v2_admin 账户是admin&#xff0c;如果密码忘记了怎么办。可以直接修改数据库表v2_admin &#xff0c;密码规则是md5(密码 加密盐) &#xff0c; 加密盐可以在…