正则表达式学习

news2024/10/7 8:31:42

文章目录

    • 入门
      • 开始和结束
      • 字符组
      • 区间
      • 特殊字符转义
      • 取反
      • 快捷匹配数字和字母
      • 匹配空白
      • 任意字符
      • 重复次数和区间
      • 或者条件
    • 进阶
      • 分组
      • 非捕获分组
      • 分组的引用
      • 正向先行断言
      • 反向先行断言
      • 正向后行断言
      • 反向后行断言
    • 常用元字符整理
    • 相关网站
      • 在线测试网站
      • 题目练习网站
    • 其他笔记

入门

开始和结束

正则表达式中 ^ 指定的是一个字符串的开始,$ 指定的是一个字符串的结束。
例如,
匹配以p开头的python字符串:
在这里插入图片描述
匹配以n结尾的python字符串:
在这里插入图片描述

字符组

字符组 [] 允许匹配一组可能出现的字符。
例如:
在这里插入图片描述
可以发现 [Pp] 既可以匹配大写的P也可以匹配小写的p

区间

正则表达式引擎在字符组中使用 连字符- 代表区间,依照这个规则,我们可以总结出三点:

  • 要匹配任意数字,可以写成 [0-9]
  • 要匹配所有小写字母,可以写成 [a-z]
  • 要匹配所有大写字母,可以写成 [A-Z]

特殊字符转义

在正则中使用 \ 就可以进行对特殊符号进行转义。
例如,匹配圆括号:

\(

取反

通过在字符数组开头使用 ^ 字符实现取反操作。
例如:匹配不包含数字的字符组:
在这里插入图片描述

快捷匹配数字和字母

下面是快捷匹配元字符与取反元字符:

元字符描述
\w与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_
\d与任意数字匹配
\W与任意非单词字符匹配
\D与任意非数字匹配

匹配空白

\s 快捷方式可以匹配空白字符,比如空格,tab、换行等。

任意字符

. 代表匹配任何单个字符,它只能出现在方括号以外

注意:. 不能匹配换行符(\n)

重复次数和区间

重复次数:
在一个字符组后加上 {N} 就可以表示在它之前的字符组出现N 次。
重复区间:
在一个字符组后加上 {M,N},M是下界而N是上界。
例如:
在这里插入图片描述
\d{3,4} 既可以匹配3个数字也可以匹配4个数字,不过当有4个数字的时候,优先匹配的是4个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ? 号。
在这里插入图片描述
开闭区间:
在一个字符组后加上 {M,},M是下界,无上界。
例如:
在这里插入图片描述
表示匹配一个或无数个数字。

或者条件

使用分组、字符组的同时还可以使用 或者条件
例如:
在这里插入图片描述
表示要提取所有相关的后缀名。
在这里插入图片描述
表示匹配字符组中为北或者大的。

进阶

分组

要实现分组很简单,使用 () 即可。
例如:
在这里插入图片描述
这段正则表达式将文本分成了两组,第一组为:0731,第二组为8825951。
分组有一个非常重要的功能——捕获数据。所以()被称为捕获分组,用来捕获数据,当我们想要从匹配好的数据中提取关键数据的时候可以使用分组。

非捕获分组

有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组 (?:表达式)不获取匹配结果,不进行存储供以后使用
例如,
在这里插入图片描述
在这里插入图片描述
通过上面的例子可以看出,使用 ?: 后续引用分组 \1 无效

分组的引用

使用 \N 可以引用编号为N的分组。
例如:
在这里插入图片描述

正向先行断言

(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式。
例如:
我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面有你,这个时候就要这么写:喜欢(?=你),这就是正向先行断言。
在这里插入图片描述

反向先行断言

(?!表达式) 的作用是保证右边不能出现某字符。
例如:
我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:喜欢(?!你),这就是反向先行断言。
在这里插入图片描述
匹配不能包含 test 的字符串:

/^((?!test).)*$/

在这里插入图片描述
匹配不能包含 test 和 name:

/^((?!test|name).)*$/

在这里插入图片描述

正向后行断言

先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看
(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式。
例如:
如果要取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)
在这里插入图片描述

反向后行断言

(?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式。
例如:
如果要取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就要这么写:(?<!我)喜欢(?!你)
在这里插入图片描述

常用元字符整理

元字符描述
\给特殊字符转义。例“\\”匹配“\”
^匹配一个字符串的开始
$匹配一个字符串的结束
*匹配前面的子表达式任意次。等价于{0,}
+匹配前面的子表达式一次或多次(大于等于1次)。等价于{1,}
?匹配前面的子表达式零次或一次。。等价于{0,1}
?当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。
{n}n是一个非负整数。匹配确定的n次。
{n,}n是一个非负整数。至少匹配n次。
{n,m}m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。
.匹配除“\n”和"\r"之外的任何单个字符。要匹配包括“\n”和"\r"在内的任何字符,请使用像“[\s\S]”的模式。
|或者。例如x|y,匹配x或y
^取反。例如[^0-9],匹配不包含数字的字符组
(pattern)匹配pattern并获取这一匹配,即分组。一个正则表达式中最多可以保存9个组
(?:pattern)非捕获分组,匹配pattern但不获取匹配结果,不进行存储供以后使用。
(?=pattern)正向先行断言,在某个位置向右看,表示所在位置右侧能匹配表达式。
(?!pattern)反向先行断言,在某个位置向右看,保证右侧不能匹配表达式。
(?<=pattern)正向后行断言,在某个位置向左看,表示所在位置左侧能匹配表达式。
(?<!pattern)反向后行断言,在某个位置向左看,保证左侧不能匹配表达式。
\b匹配一个单词的边界,也就是指单词和空格间的位置。
\B匹配一个非单词的边界。
\d与任意数字匹配
\W与任意非单词字符匹配
\D与任意非数字匹配
\w与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_
\f匹配一个换页符。
\t匹配一个制表符。
\n匹配一个换行符。
\r匹配一个回车符。
\s匹配一个空白符,即不可见字符,包括空格、制表符、换页符等等
\S匹配一个非空白符,,即可见字符

参考链接

相关网站

在线测试网站

菜鸟工具:
参考链接
有详细的语法解释,但是"/"需要转义:
参考链接

题目练习网站

参考链接

其他笔记

1、正斜杠/Java正则表达式中不是特殊字符,不需要转义。 "\\\\/"等效于"/"
2Java Match类中的matches()方法是完全匹配,即整个字符串必须匹配该正则表达式;find()方法是部分匹配,即在整个字符串中,寻找匹配该正则表达式的子字符串序列,只要找到这样的子字符串,即返回true3(ab){1,3},表示ab一起连续出现最少1次,最多三次。ab{1,3},表示a后面紧跟的b出现的最少一次,最多三次。这就是括号分组的意义。

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

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

相关文章

计算机毕设Python+Vue学生量化考核系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Python中groupby函数详解(非常容易懂)

目录&#xff1a;Python中的groupby函数一、groupby 能做什么&#xff1f;二、单类分组2.1 创建数据集三、多类分组一、groupby 能做什么&#xff1f; groupby函数主要的作用是进行数据的分组以及分组后地组内运算&#xff01; 于数据的分组和分组运算主要是指groupby函数的应…

网络安全等级保护十问十答

网络安全等级保护十问十答1.什么是等级保护&#xff1f;2.为什么需要等级保护&#xff1f;3.目标客户是&#xff1f;4.等保工作步骤包括什么&#xff1f;5.等保测评结论有几种结果&#xff1f;6.等保如何定级&#xff1f;7. 定级对象在哪备案&#xff1f;8. 等级保护都测评什么…

[附源码]计算机毕业设计Node.js宠物商店网站(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Opencv(C++)笔记--Sobel算子

1--Sobel算子 1-1--原理 Sobel算子的构成如下图所示&#xff1a; 基于 Sobel 算子可以实现对图像的边缘检测&#xff0c;Gx常用于提取纵向边缘&#xff0c;Gy则常用于提取横向边缘&#xff1b; 1-2--Opencv API 在 ddeth 参数上&#xff0c;使用 cv::CV_16S 处理 8 位原图像&…

jsp+ssm计算机毕业设计高校班主任班级管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

跨模态检索的简单实现(pytorch)

目录说明说明往期文章和专栏代码及数据集下载什么是跨模态检索代码导入需要的库构建图像、文本子网络加载数据集计算mAP损失函数构建总损失函数训练部分主函数参数设置查看结果说明 说明 还是读研时候剩下的代码&#xff0c;是我从几篇论文里面摘出来的代码做了简单的拼装&am…

SCN时间序列预测模型详解(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 SCN&#xff08;System Change Number 简称 SCN&#xff09;是当Oracle数据库更新后&#xff0c;由DBMS自动维护去累积递增的一…

数据结构链式栈

上一节我们学习了顺序栈 我们了解到栈就是特殊的线性表 我们之前用过顺序表实现了栈 那么我们也可以用单链表的方式来实现一个链式栈 我们可以回顾一下单链表的结构 基础数据结构链表_iccoke的博客-CSDN博客 我们可以看到简单的对尾部进行操作 很难实现时间复杂度达到O&am…

JdbcTemplate

JdbcTemplateJdbcTemplate &#xff08;概念和准备&#xff09;1. 什么是 JdbcTemplate&#xff08;1&#xff09; Spring 框架对 JDBC 进行封装&#xff0c;使用 JdbcTemplate 方便实现对数据库操作2. 准备工作&#xff08;1&#xff09;配置文件的准备&#xff08;2&#xff…

100份PDF合并还不到3分钟,这2个方法非常简单,请低调使用

PDF文件作为我们工作中最为常见的“文件格式”之一。似乎哪里都有它的身影&#xff0c;有时我们还需要对PDF文件进行编辑和处理。那么&#xff0c;在众多PDF编辑和处理操作上&#xff0c;PDF合并可以算得上使用频率很高的存在。不过大多数小伙伴们并不清楚具体的操作方式是怎样…

Feign的另一种玩法-动态Feign

1.Feign传统方式的不足 ①.在微服务架构中,当我们使用Feign传统方式进行服务调用的时候,需要在每个服务消费者中添加FeignClient接口,编写对应的方法,而且当服务生产者Handler新增方法之后,服务消费者也要在FeignClient接口中添加方法,这样的话,会有些累赘. 那么能不能在调用服…

[附源码]计算机毕业设计Node.js畅玩电竞网咖购物点餐网站(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

R语言 线性混合效应模型实战案例

介绍 最近我们被客户要求撰写关于性混合效应模型的研究报告&#xff0c;包括一些图形和统计输出。首先&#xff0c;请注意&#xff0c;围绕多层次模型的术语有很大的不一致性。例如&#xff0c;多层次模型本身可能被称为分层线性模型、随机效应模型、多层次模型、随机截距模型…

web大学生网页作业成品 蛋糕店美食餐饮网站设计与实现(HTML+CSS+JavaScript)

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

代码随想录训练营第54天|LeetCode 392.判断子序列、115.不同的子序列

参考 代码随想录 题目一&#xff1a;LeetCode 392.判断子序列 确定dp数组及其下标的含义 dp[i][j]&#xff1a;s字符串中0&#xff5e;i字符构成的子串和t字符串中0&#xff5e;j字符构成的子串的最长公共子序列的长度。 确定递推公式 dp[i][j]有两个可能的来源&#xff1a;…

内点法求最优潮流和微电网调度(风、光、蓄电池、燃油机)(Matlab实现)

目录 1 概述 2 案例 2.1算例描述 2.2 数据 3 一点小知识 4 Matlab代码实现 1 概述 由于电力系统本身的复杂性,电力潮流优化具有规模大,约束条件多和非线性的特点。通过对最优潮流的求解,最终达到优化已有资源、降低发电厂耗量成本、减少电网线路损耗、提高电力系统输电…

JSON的定义、基本使用、以及和对象之间的相互转换

json的定义与基本使用 <script>//定义jsonvar json{"name" : "张三","age" : "18岁","addr" : ["北京","上海","天津"]}//获取数据console.log(json.age)console.log(json.name)consol…

【算法】可解释机器学习-CAM / Grad_CAM(Datawhale)

可解释机器学习-CAM / Grad_CAM一、CAM1.CAM算法介绍2.CAM的特点3.CAM算法的缺点二、Grad_CAM1.Grad_CAM算法介绍2.Grad_CAM算法优点3.Grad_CAM算法缺点4.Grad_CAM算法的变种1&#xff09;Grad_CAM算法2&#xff09;ScoreCAM算法3&#xff09;LayerCAM算法一、CAM 1.CAM算法介…

jsp+ssm计算机毕业设计高铁售票管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…