Java 中的正则表达式

  • 转义字符由反斜杠\+x组成,用于实现特殊功能
  • 当想取消这些特殊功能时可能在前面加上反斜杠\

例如在Java中\也具有特殊意义,前面加一个反斜杠表示取消特殊意义,表示1个普通的反斜杠\,\\\\表示2个普通的反斜杠\\。其实就是要求Java中的字符串输出结果是正确的正则表达式。

1. 概念

其实就是规则。

2. 字符类

  • 单字符匹配规则,语法示例:
  1. [abc]:a 或者 b,或者 c 字符中的一个;
  2. [^abc]:除 a,b,c 以外的任何字符中的一个;
  3. [a-z]:a-z 小写字母中的一个;
  4. [A-Z]:A-Z 大写字母中的一个;
  5. [0-9]:0-9 数字中的一个;
  6. [a-zA-Z0-9]:a-z 或者 A-Z 或者 0-9 中的一个;
  7. [a-dm-p]:a 到 d 或 m 到 p 中的一个。

3. 逻辑运算符

  • 语法示例:  
  1. &&:并且
  2. | :或者

4. 预定义字符

  • 语法示例:
  1. “.” : 匹配任何字符;
  2. “\d”:任何数字 [0-9] 的简写;
  3. “\D”:任何非数字 [^0-9] 的简写;
  4. “\s”: 空白字符 [ \t\n\x0B\f\r] 的简写;
  5. “\S”: 非空白字符 [^\s] 的简写;
  6. “\w”:大小字母或数字或下划线或汉字;
  7. “\W”:非单词字符 [^\w] ;
  8. “\t”:一个 Tab 的间隔。

5. 数量词

  • 语法示例:
  1. X? : 0 次或 1 次;
  2. X* : 0 次或者多次;
  3. X+ : 1 次或者多次;
  4. X{n} : 正好好 n 次;
  5. X{n,} : 至少 n 次;
  6. X{n,m}: n 到 m 次(n 和 m 都是包含的)

正则表达式的作用:

(1)检验字符串是否满足某些规则。

(2)查找一段文本中满足某些规则的内容。

1、下面是作用1:检验字符串是否满足某些规则的练习

(1)请编写正则表达式验证用户输入的手机号码是否满足要求。

  •  中国手机号码是以 13、14、15、16、17、18、19 开头的11位数字:1[3-9]
    String regex = "1[3-9]\\d{9}";System.out.println("15236302279".matches(regex));

(2)请编写正则表达式验证用户输入的邮箱号是否满足要求。

  • 邮箱包括用户名和域名两部分,它们之间由@符号连接
  • 用户名包括字母、数字和下划线,至少有一个字符:\\w+
  • 域名包括两部分:邮箱服务提供商和域名
  • 邮箱服务提供商:任意的字母加数字,总共出现2-7次:[\\w&&[^_]]{2,7}
  • 域名:大小写字母,如.com,.cn,.edu.cn等,出现2-3次:(\\.[a-zA-Z]+){1,2}
    String regex2 = "\\w+@[\\w&&[^_]]{2,7}(\\.[a-zA-Z]+){1,2}";System.out.println("liuyujie@163.com".matches(regex2));

(3)请编写正则表达式验证用户输入的座机号码是否满足要求。

  • 座机号码包括区号和电话号码两部分,它们之间通常用连字符 - 隔开。有时候也可以省略连字符。
  • 区号一般是3位或4位数字,第一位是0:0\\d{2,3}
  • 连字符-,有时也可省略:-?
  • 电话号码一般是7位或8位数字,第一位不能为0:\\d{7,8}。
    String regex3 = "0\\d{2,3}-?\\d{7,8}";System.out.println("010-12345678".matches(regex3));

2、查找一段文本中满足某些规则的内容

练习:

  1. 首先获取正则表达式的对象;
  2. 然后获取文本匹配器的对象;
  3. find()方法:文本匹配器从头开始读取,寻找是否有满足规则的子串。如果没有,方法返回false;如果有,返回true。在底层记录子串的起始索引和结束索引+1。
  4. group()方法:方法底层会根据find方法记录的索引进行字符串的截取,其实就是利用substring(起始索引,结束索引);包头不包尾,把截取的小串进行返回。
     //1.获取正则表达式的对象Pattern p = Pattern.compile("Java\\d{0,2}");//2.获取文本匹配器的对象//m去读取text,找符合p规则的子串Matcher m = p.matcher(text);//3.利用循环获取while (m.find()) {String s = m.group();System.out.println(s);}

有如下文本,按要求爬取数据。

Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台。

需求1:爬取版本号为8,11.17的Java文本,但是只要Java,不显示版本号。

需求2:爬取版本号为8,11,17的Java文本。正确爬取结果为:Java8 Java11 Java17 Java17

需求3:爬取除了版本号为8,11,17的Java文本。

6. 零宽断言和负向零宽断言

  1. (?=...) 用于查找在某些内容(但并不包括这些内容)之前的东西。
  2. (?!...) 排除某些内容的匹配。例如:\d{3}(?!\d),首先匹配三位数字,然后这三位数字的后面不能是数字。
  3. (?:...)用来对表达式进行分组,但是不会捕获。例如:表示匹配 "Java" 这个单词,但不会把它作为一个捕获组,因此不能通过后向引用\1等方式再次使用这个匹配结果。
        String s = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11," +"因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//1.定义正则表达式//?指代前面的数据Java//=表示在Java后面要跟随的数据//但是在获取的时候,只获取前半部分//需求1:String regex2 = "((?i)Java)(?=\\d{1,2})";//需求2:String regex2 = "((?i)Java)(\\d{1,2})";String regex3 = "((?i)Java)(?:\\d{1,2})";//需求3:String regex4 = "((?i)Java)(?!\\d{1,2})";Pattern p = Pattern.compile(regex4);Matcher m = p.matcher(s);while (m.find()) {System.out.println(m.group());}

7. 贪婪匹配和懒惰匹配

  1. 贪婪匹配:匹配尽可能多的字符。
  2. 懒惰匹配:匹配尽可能少的字符。
  3. 正则表达式在匹配多个字符时尽可能多,默认是贪婪匹配;如果在后面加上?则表示懒惰匹配,如 +? 表示懒惰匹配。

8. 忽略大小写

  1. (?i) :在开头使用表示接下来所有的数据都忽略大小写,但是一个字符串中如果只想忽略某个字符的大小写,可以这样写:a((?i)b)c,只忽略字母b的大小写,a和c只能是小写。

9. 捕获分组和非捕获分组

  1. 捕获分组是用()定义的分组,它可以把匹配到的内容保存到一个单独的组中,以便后续引用或者在匹配后进行处理。
  2. (?:) (?=) (?!)都是非捕获分组,更多的使用(?:...)这样的语法来剥夺一个分组对组号分配的参与权。

10. 分组组号

  1. ()表示捕获分组。
  2. 组号如何识别?从左往右,左括号是第几个就是第几组,组号是连续不间断的。
  3. \\X:表示把第X组的内容再出来用一次。

需求1:判断一个字符串的开始字符和结束字符是否一致?只考虑一个字符。

  • 用.来匹配第一个字符。
    String regex = "(.).*\\1";System.out.println("a121a".matches(regex));

需求2:判断一个字符串的开始部分和结束部分是否一致?可以有多个字符。

    String regex2 = "(.+).*\\1";System.out.println("abc123abc".matches(regex2));

需求3:判断一个字符串的开始部分和结束部分是否一致?开始部分内部每个字符也需要一致。

    String regex3 = "((.)\\2*).*\\1";System.out.println("aaa123aaa".matches(regex3));

需求4:将字符串“我要学学编编编编程程程程程程”替换为“我要学编程”,即将重复的字符替换为单个字符。

  • 如何获取一段文本中重复2次及以上的字符?(.)\\1+
  • 字符串的replaceAll和split两个方法都可以使用正则表达式
  • 在正则表达式外使用分组,格式为$X,其中X为组号
    String text = "我要学学编编编编程程程程程程";String regex = "(.)\\1+";System.out.println(text.replaceAll(regex, "$1"));

结合需求1-3以及4的思考: 

public class RegexDemo7 {public static void main(String[] args) {String text = "1a222a";String regex1 = "(.).*\\1";Pattern p = Pattern.compile(regex1);Matcher m = p.matcher(text);while (m.find()) {String s = m.group();System.out.println(s);}}
}

输出结果 

 

当文本为下面这个时输出结果为 

    String text = "1a121a";

 

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

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

相关文章

Python那些优质可视化工具!

作者:Lty美丽人生 https://blog.csdn.net/weixin_44208569 本次分享10个适用于多个学科的Python数据可视化库,其中有名气很大的也有鲜为人知的! 1、matplotlib 两个直方图 matplotlib 是Python可视化程序库的泰斗。经过十几年它任然是Pytho…

【前端速通系列|第二篇】Vue3前置知识

文章目录 1.前言2.包管理工具npm2.1下载node.js2.2配置 npm 镜像源2.3 npm 常用命令 3.Vite构建工具4.Vue3组件化5.Vue3运行原理 1.前言 本系列文章旨在帮助大家快速上手前端开发。 2.包管理工具npm npm 是 node.js中进行 包管理 的工具. 类似于Java中的Maven。 2.1下载nod…

Autoware 定位之基于ARTag的landmark定位(六)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务,并且需要GPU资源,可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU,按时收费每卡2.6元,月卡只需要1.7元每小时&…

CSS相对定位和绝对定位的区别

CSS相对定位和绝对定位的区别 区别1:相对的对象不同 相对定位是相对于自己绝对定位是相对于离自己最近的有定位的祖先 区别2:是否会脱离文档流 相对定位不会脱离文档流,不会影响其他元素的位置绝对定位会脱离文档流,会影响其他元素的布局 代…

玩转springboot之SpringBoot打成jar包的结构

SpringBoot打成jar包的结构 springboot通常会打成jar包,然后使用java -jar来进行执行,那么这个jar包里的结构是什么样的呢 其中 BOOT-INF 中包含的classes是我们程序中所有的代码编译后的class文件,lib是程序所引用的外部依赖 META-INF 这个…

AM243-Timer

目录 简介初始化代码测试API补充 简介 定时中断。 初始化 开启定时器,最多支持8个硬件定时器 定时周期1ms 增加一个GPIO输出口PRG0_PRU1_GPO15/M4 ,我们会在定时中断中每隔1ms翻转该引脚,理想情况下应该在该引脚上测得2ms周期500Hz的矩形…

手把手教你打数学建模国赛!!!第一天软件准备篇

第一天软件准备 MATLAB MATLAB(Matrix Laboratory)是一种强大的数值计算和科学编程软件。它提供了丰富的数学函数和工具,用于数据分析、算法开发、信号处理、图像处理、控制系统设计、仿真等应用领域。 MATLAB具有直观的语法,使…

Postman接口模拟请求工具使用技巧

Postman是一款非常强大的接口模拟请求工具,可以帮助开发者快速测试、调试API接口。下面集合实际使用过程中的经验,分享大家一些基础使用技巧: 1. 安装与启动:首先在官网(Download Postman | Get Started for Free&…

【Linux信号】阻塞信号、信号在内核中的表示、信号集操作函数、sigprocmask、sigpending

我们先来了解一下关于信号的一些常见概念: 实际执行 信号的处理动作 称为信号递达。 信号从产生到递达的之间的状态称为信号未决。 进程可以选择阻塞(Block)某个信号。 被阻塞的信号产生时是处于未决状态的,知道进程解除对该信号的阻塞,该…

零信任作为解决方案,Hvv还能打进去么?

零信任平台由“中心组件服务”三大部分构成,以平台形式充分融合软件定义边界(SDP)、身份与访问管理(IAM)、微隔离 (MSG)的技术方案优势,通过关键技术的创新,实现最佳可信…

手机数据恢复篇:如何从 Android 手机恢复消失的照片

丢失 Android 手机中的照片现在已成为您可能遇到的最糟糕的情况之一。随着手机在相机方面越来越好,即使是那些不热衷于拍照的人也成为了摄影师。 如今,人们可以随时随地拍摄照片,每一张照片都保存着回忆和数据,因此,丢…

变得越来越优秀的方法

反省后看到问题很正常,接纳-行动-改变-能量-帮助-成长变优秀;温和后需要【中庸智慧】灵活处世,不做老好人,须有原则有框架! —— 只有深刻地反省,我们才能真正地认识自己,我们反省后会看到自己…

昇思25天学习打卡营第19天|应用实践之基于MobileNetv2的垃圾分类

基本介绍 今天的应用实践是垃圾分类代码开发,整体流程是读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。采用的是MobileNetv2模型,使用官方提供的数据集,数据集分为4大类&…

【MySQL】8.复合查询

复合查询 一.基本查询回顾(新增子查询)二.多表查询三.自连接四.子查询1.单列单行子查询2.单列多行子查询——三个关键字3.多列子查询4.在 from 子句中使用子查询 五.合并查询六.总结 一.基本查询回顾(新增子查询) //1.查询工资高于500或岗位为MANAGER的雇员,同时还…

Avalonia创建导航菜单

1. 简介 已开源,后续还会继续更新学习到的内容,欢迎Star,GitHub地址 开发Avalonia需要的一些资料,我已经分享到另一篇文章 示意图 涉及到内容: MVVM路由模板 开发: 开发工具:Rider&#x…

【linux】进程间通信(IPC)——匿名管道,命名管道与System V内核方案的共享内存,以及消息队列和信号量的原理概述

目录 ✈必备知识 进程间通信概述 🔥概述 🔥必要性 🔥原理 管道概述 🔥管道的本质 🔥管道的相关特性 🔥管道的同步与互斥机制 匿名管道 🔥系统调用接口介绍 🔥内核原理 …

C++ QT开发 学习笔记(1)

C QT开发 学习笔记(1) 考试系统 创建项目 新建Qt桌面应用程序,项目名:ExamSys。 类信息:类名LoginDialog继承自QDialog (1) ExamSys.pro 工程文件,包含当前工程的相关信息。 QDialog 是 Qt 框架中用…

二、计划任务

1.什么是计划任务 对于一些特定的任务,可以设定任务,让服务在规定时间去执行 2.windows中的计划任务 打开控制面板》管理工具》任务计划程序》创建基本任务 3.linux中的计划任务 周期性的计划crontab crontab -l :显示当前的计划惹怒我 -e&#…

大健康产业运营模式|大健康行业商业模式|健康管理盈利模式

大家好!今天我们来聊聊如何在大健康行业中选择一个适合自己的商业模式,从保健、医疗、健身、美容、养老等方面快速发展并取得成功。 首先,大健康行业涵盖了很多领域,但最核心的是保健和医疗,这两者是保障大家健康的基础…

通过maven基于springboot项目构建脚手架archetype

1、引入脚手架构建的插件依赖 <!--构建脚手架archetype--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-archetype-plugin</artifactId><version>3.2.1</version></plugin><plugin><…