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.rhkb.cn/news/378488.html

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

相关文章

【排序算法】1.冒泡排序-C语言实现

冒泡排序(Bubble Sort)是最简单和最通用的排序方法,其基本思想是:在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数,否则不交换;如此下去,直…

Java红娘婚恋相亲交友系统小程序源码

红娘婚恋相亲交友小程序:遇见爱情,从指尖开始💖 📱 掌中红娘,随时待命 💌 在这个数字化时代,爱情也迎来了它的新舞台——“红娘婚恋相亲交友小程序”。只需轻轻一点,你的专属红娘就…

git自动pull同步远程若干分支与本地若干分支

git自动pull同步远程若干分支与本地若干分支 假设远程代码仓库有100个分支,而本地只有10个本地分支与远程分支一一对应,现在要保持本地的这个10个分支与远程一致,最笨的方法是checkout到每个分支,然后一个一个的 git pull origin…

【文心智能体】前几天百度热搜有一条非常有趣的话题《00后疯感工牌》,看看如何通过低代码工作流方式实现图片显示

00后疯感工牌体验:https://mbd.baidu.com/ma/s/6yA90qtM 目录 前言比赛推荐工作流创建工作流入口创建工作流界面工作流界面HTTP工具卡点地方 总结推荐文章 前言 前几天百度热搜有一条非常有有趣《00后疯感工牌》。 想着通过文心智能体去一键生成00后疯感工牌是不是…

打包一个自己的Vivado IP核

写在前面 模块复用是逻辑设计人员必须掌握的一个基本功,通过将成熟模块打包成IP核,可实现重复利用,避免重复造轮子,大幅提高我们的开发效率。 接下来将之前设计的串口接收模块和串口发送模块打包成IP核,再分别调用…

华为USG6000V防火墙安全策略用户认证

目录 一、实验拓扑图 二、要求 三、IP地址规划 四、实验配置 1🤣防火墙FW1web服务配置 2.网络配置 要求1:DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问 要求2:生产区不…

list模拟实现【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间类的成员变量为什么节点类是用struct而不是class呢?为什么要写get_head_node? 迭代器迭代器在list类里的实例化和重命名普通迭代器operator->()的作用是什么? const迭代器反向迭…

tkinter-TinUI-xml实战(12)pip可视化管理器

引言 pip命令行工具在平常使用方面确实足够简单,本项目只是作为TinUI多界面开发的示例。 当然,总有人想用GUI版pip,实际上也有。不过现在,我们就来手搓一个基于python和TinUI(tkinter)的pip可视化管理器。…

Java SpringAOP简介

简介 官方介绍: SpringAOP的全称是(Aspect Oriented Programming)中文翻译过来是面向切面编程,AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生…

模块化和包管理工具

一,模块化 1.定义 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用 2.模块化…

【React Hooks原理 - forwardRef、useImperativeHandle】

概述 上文我们聊了useRef的使用和实现,主要两个用途:1、用于持久化保存 2、用于绑定dom。 但是有时候我们需要在父组件中访问子组件的dom或者属性/方法,而React中默认是不允许父组件直接访问子组件的dom的,这时候就可以通过forwa…

如何通过网络快速搜寻到自己的STM32设备

目录 一、问题概述 二、解决思路 三、代码实现 1.创建任务 2.UDP广播接收 一、问题概述 以前一直用RS232串口修改设备配置信息,但是现场施工人员的232线太细,经常容易断掉,这次准备用网口去修改,遇到了一个问题,…

【简历】惠州某二本学院:前端简历指导,秋招面试通过率为0

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这是一份25届二本同学,投递前端职位的简历,那么在校招环节二本同学主要针对的还是小公司,这个学校因为…

【B树、B-树、B+、B*树】

目录 一、B-树(即B树)的定义及操作1.1、定义1.2、操作1.2.1、查找1.2.2、插入1.2.3、删除 二、B树的定义及操作2.1、定义2.2、操作2.2.1、查找2.2.2、插入2.2.3、删除 三、B*树 一、B-树(即B树)的定义及操作 1.1、定义 B-tree即…

18_Shell好用工具:sort

18_Shell好用工具:sort 选项说明-k指定要排序的列-nnumber,按照数值大小排序-rreverse,逆序-t分隔符-u去重-o保存排序到文件 一、数字升序 #sort1.txt文件纯数字 #升序 sort -n sort1.txt #降序 sort -nr sort1.txt二、数字升序去重 #数字…

框架设计MVC

重点: 1.用户通过界面操作,传输到control,control可以直接去处理View,或者通过模型处理业务逻辑,然后将数据传输给view。 2.control包含了model和view成员。 链接: MVC框架详解_mvc架构-CSDN博客 MVC架…

C语言------指针讲解(2)

目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 一、数组名的理解 通过学习,我们知道:数组名和数组首元素的地址打印出来的结果一模一样,数组…

【STM32】RTT-Studio中HAL库开发教程三:IIC通信--AHT20

文章目录 一、I2C总线通信协议二、AHT20传感器介绍三、STM32CubeMX配置硬件IIC四、RTT中初始化配置五、具体实现代码六、实验现象 一、I2C总线通信协议 使用奥松的AHT20温湿度传感器,对环境温湿度进行采集。AHT20采用的是IIC进行通信,可以使用硬件IIC或…

顺序表的应用——通讯录

通讯录的实现分为五个文件分别进行编写,分别为:SeqList.c,SeqList.h,Contact.c,Contact.h,test.c 其中前两个文件为上一篇博客中的顺序表的操作,后三个文件为通讯录功能的实现。 SeqList.h #d…

jenkins系列-07.轻易级jpom安装

jpom是一个容器化服务管理工具:在线构建,自动部署,日常运维, 比jenkins轻量多了。 本篇介绍mac m1安装jpom: #下载:https://jpom.top/pages/all-downloads/ 解压:/Users/jelex/Documents/work/jpom-2.10.40 启动前修…