正则表达式 REGEX-Regular Expression
正则表达式 REGEX-Regular Expression
根据b站up 胶囊大人 和 奇乐编程学院 学习总结
链接
胶囊大人:https://www.bilibili.com/video/BV19t4y1y7qP/?spm_id_from=333.337.search-card.all.click&vd_source=d475b6658116009f168918b328e1050b
奇乐编程学院:https://www.bilibili.com/video/BV1da4y1p7iZ/?spm_id_from=333.337.search-card.all.click&vd_source=d475b6658116009f168918b328e1050b
正则表达式可以匹配某些特定的数据,如果你想要从庞大的文字信息中提取出一小段你需要的数据,那么正则表达式或许能帮到你
正则练习网址: https://www.codejiaonang.com/
正则在线测试网站: https://regexr-cn.com/
限定符:?、*、+、{n}限定字符出现的次数、{M,N}限定区间
元字符:\d、\w、\s;\D、\W、\S;. 不包含转行符的任意字符
入门
基础入门
- 字符组
如果只是使用正则表达式来匹配文本,没有什么意义,毕竟检测一个文本中是否有另一个字符串本来就非常简单。正则表达式强大的地方在于它可以迅速地用极简单的方式达到字符串的复杂控制
字符组([])允许匹配一组可能出现的字符
[Pp]ython
[Pp]既可以匹配大写的P也可以匹配小写的p
测试:
使用字符组匹配Java和 java。
[Jj]ava- 匹配多个单词
测试:
请你使用字符组匹配Ruby、Rube、ruby、rube。
[Rr]ub[ey]- 区间
“-”可以表示区间
有一些常见的字符组非常大,比如,我们要匹配任意的数字,字母,这个时候肯定不适合使用上述把所有数字和字母写到[]当中去。为了适应这一点,正则表达式引擎在字符组中使用连字符(-)代表区间:
- 要匹配任意数字可以使用[0-9]
- 如果想要匹配所有小写字母,可以写成[a-z]
- 想要匹配所有大写字母可以写成[A-Z]
- []字符组中可以放多个条件,如:[0-9a-zA-Z]
测试:
匹配数据所有的数字、小写字母和大写字母
[0-9a-zA-Z]
- 匹配特殊字符
正则表达式当中也适用转义字符“\”
测试:
编写正则表达式匹配下列符号[]、()、–
[-(]]或[[-(](顺序无要求)- 取反
我们定义的字符组都是有可能出现的字符定义,不过有时候我们可能希望根据不会出现的字符定义字符组
以通过在字符数组开头使用 ^ 字符实现取反操作,从而可以反转一个字符组(意味着会匹配任何指定字符之外的所有字符)
测试:
如:n[^e]
n[^e]表示n后面的字母不能为e快捷方式
- 快捷匹配数字和字母
以目前学到的内容,如果想要匹配所有的字母,会使用[A-Za-z],要匹配数字会使用[0-9]。
有更简洁的方式对应:
正则表达式引擎提供了一些快捷方式如:
\w 可以与任意单词字符匹配,任意单词字符表示 [A-Z]、 [a-z]、[0-9]、_
当我们想要匹配任意数字的时候也可以使用快捷方式\d,d即digit数字的意思,等价于[0-9]。
如:使用快捷方式匹配单词和数字
\w- 匹配空白\s
\s快捷方式可以匹配空白字符,比如空格,tab、换行等- 匹配单词边界\b
\b 匹配的是单词的边界。
如:\bmaster\b 就仅匹配有边界的master单词。当然其他类型的数据,比如数字也能匹配
匹配字符串中的数字和小写字母:[\da-z]- 快捷方式取反\W
快捷方式也可以取反,例如对于\w的取反为\W,将小写改写成大写即可,其他快捷方式也遵循这个规则。
如:使用正则表达式匹配开头不以字母开头的单词——\W- 开始和结束^、$
正则表达式中 ^指定的是一个字符串的开始,指定的是一个字符串的结束。如:以Java开头——Java;以Python结尾——Python指定的是一个字符串的结束。 如:以Java开头——^Java;以Python结尾——Python指定的是一个字符串的结束。如:以Java开头——Java;以Python结尾——Python- 任意字符 .
.字符代表匹配任何单个字符,它只能出现在方括号以外。
**值得注意的是: “.”字符只有一个不能匹配的字符,也就是换行符(\n)。
如:匹配任意字母之后是ar的字符串——.ar- 可选字符 ?
有时,我们可能想要匹配一个单词的不同写法,比如color和colour,或者honor与honour。
这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。
如:honou?r——在这里 u? 表示u是可选的,即可以出现也可以不出现,可以匹配的是 honor 和 honour
?的作用就是匹配它之前的字符0次或1次。- 重复{}
到目前为止,我们只是学习了关于仅出现一次的字符串匹配,在实际开发中,肯定不能满足需求,比如要匹配电话号码、身份证的时候就无法满足需求了。如果遇到这样的情况,我们可能期望一个字符组连续匹配好几次。在一个字符组后加上{N} 就可以表示在它之前的字符组出现N次。
如匹配电话号码:\d{4}-\d{7}——其可以匹配诸如9999-8888888等形式的电话号码- 重复区间{M,N}
可能有时候,我们不知道具体要匹配字符组要重复的次数,比如身份证有15位也有18位的。这里重复区间就可以出场了,语法:{M,N},M是下界而N是上界。
如\d{3,4}
\d{3,4} 既可以匹配3个数字也可以匹配4个数字,不过当有4个数字的时候,优先匹配的是4个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ?号——如:\d{3,4} ?- 开闭区间{1,}
有时候我们可能遇到字符组的重复次数没有边界,这个时候闭区间不写即可表示匹配一个或无数个
如:\d{1,}——即至少有一个数字- 速写+、*
还可以使用两个速写字符指定常见的重复情况,可以使用 + 匹配1个到无数个,使用 *代表0个到无数个。即:+等价于{1,},*等价于{0,}。
如:\d+
进阶
分组与回溯引用
- 分组
在正则表达式中还提供了一种将表达式分组的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。要实现分组很简单,使用**()**即可。
如:(\d{4})-(\d{7})——0871-6566666
这段正则表达式将文本分成了两组,第一组为:0871,第二组为6566666
分组有一个非常重要的功能——捕获数据。所以“()”被称为捕获分组,用来捕获数据,当我们想要从匹配好的数据中提取关键数据的时候可以使用分组。(\d{4}) 和 (\d{7})就分别捕获了两段数据:第一组为:0871,第二组为6566666- 或者条件
使用分组的同时还可以使用 或者(or)条件。
例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个 |符号:
(.jpg|.gif|.jpeg|.png)- 非捕获分组
有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组(?:表达式),从而不捕获数据,还能使用分组的功能。
例如想要匹配两个字母组成的单词或者四个字母组成的单词就可以使用非捕获分组:\b(?:\w{2}|\w{4})\b
因为正则表达式中()代表分组,所以如果要匹配()就需要将使用转义符\,例如要匹配)就要写成 )。- 分组的回溯引用
正则表达式还提供了一种引用之前匹配分组的机制,有些时候,我们或许会寻找到一个子匹配,该匹配接下来会再次出现。
使用\N可以引用编号为N的分组
如:<(\w+)>.*?</\1>——提示
通过这个例子,可以发现 \1 表示的就是第一个分组,在这里第一个分组匹配的是 font 所以\1 就代表font。先行断言
很多人也称先行断言和后行断言为环视,也有人叫预搜索
- 正向先行断言(?=表达式)
(?=表达式),指在某个位置向右看(从左往右看),表示所在位置右侧必须能匹配表达式
如:
我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面有你,这个时候就要这么写:喜欢(?=你),这就是正向先行断言。
如:
现在请你编写正则表达式进行密码强度的验证,规则如下:
至少一个大写字母
至少一个小写字母
至少一个数字
至少8个字符
左边为需要你的正则需要匹配的,右边的字符串是你的正则不需要匹配的。
(?=.[a-z])(?=.[A-Z])(?=.*\d+)(?=\w{8,})——还有很多答案- 反向先行断言(?!表达式)
反向先行断言(?!表达式)的作用是保证右边不能出现某字符。
例如: 我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:喜欢(?!你),这就是反向先行断言。
如:
编写正则表达式匹配不是qq邮箱的数据后行断言
- 正向后行断言(?<=表达式)
先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。
正向后行断言:(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式
例如:如果要取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)。- 反向后行断言(?<!表达式)
反向后行断言:(?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式
例如:如果要取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就要这么写:(?<!我)喜欢(?!你)。
正则表达式中的高级概念
- 贪婪与懒惰匹配
*、+、{}在匹配字符的时候默认会尽可能多的去匹配字符
一般会在这些符号右边加一个”?“号,它会将正则表达式中默认的贪婪匹配(Greedy Match)切换为懒惰匹配(Lzay Match)
具体符号图
正则表达式 REGEX-Regular Expression相关推荐
- 正则表达式(regular expression [regExp])
正则表达式(regular expression [regExp]) 介绍 概念 一个正则表达式,就是用某种模式去匹配字符串的一个公式.许多语言都提供了对正则表达式的支持 正则表达式初体验 1, ...
- python 正则表达式(Regular Expression)基础学习笔记
python 正则表达式(Regular Expression) 正则表达式基础 search():只返回第一个匹配的字符串 findall():将搜寻结果以列表方式返回 import re # 导入 ...
- Python正则表达式(regular expression)简介-re模块
Python正则表达式(regular expression)简介-re模块 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 就其本质而言,正则表达式(或RE模块)是一种小型的,高度 ...
- 正则表达式(Regular Expression)基础使用、贪婪性、懒惰性以及常用方法
正则表达式(Regular Expression) 正则表达式是处理字符串的规则 正则表达式只能处理字符串 test => 它是一个规则,验证某个字符串是否符合某规则 exec/match =& ...
- 正则表达式(Regular Expression)——入门笔记(常用正则表达式符号、正则表达式在线调试工具)
1.正则表达式到底是什么东西? 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)是用于描述字符串规则的工具.换句话说,正则表达式就是记录文本规则 ...
- php中ip地址的正则表达式,PHP_IP地址正则表达式匹配方法,正则表达式(Regular Expression, - phpStudy...
IP地址正则表达式匹配方法 正则表达式(Regular Expression,在代码中常简写为regex.regexp或RE)是计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个 ...
- 通配符(WildCard)与正则表达式(Regular Expression)
1.通配符(wildcard)就是万用牌的意思 * 表示匹配任意长度的任意字符 ? 表示匹配一个任意字符 [-]则表示匹配括号中列出的字符中的任意一个 [!..]表示不匹配括号中列出的字符中的任意一个 ...
- 编译原理学习之:正则表达式(regular expression)和非正则语言(non-regular languages)
文章目录 回顾子集构造(NFA→\rightarrow→DFA) 正则语言的闭包结果 正则语言的 Union 依然是正则语言 正则语言的 concatenate ○○○ 操作依然是正则的 正则语言的 ...
- P4:正则表达式(Regular Expression)学习笔记
正则表达式学习 1.初始正则表达式 1.1正则表达式练习1 1.2正则表达式练习2 1.3正则表达式练习3 2.正则表达式源码分析 2.1 源码分析-matcher.find() 2.2源码分析- m ...
- Day011--java中的正则表达式(Regular Expression)
目录 案例一:获取文本中的数字,字母,中文,并分别打印出来 案例一的相关知识概述: 元字符 字符匹配符 限定符 贪婪匹配 选择匹配符 定位符 起始和结束字符的应用:验证qq邮箱是否正确 字母查找不区分 ...
最新文章
- FFmpeg #39;scale#39; filter not present, cannot convert pixel formats.
- 10分钟完成一个业务流程的发布
- win7与ubuntu 13.04 64位双系统安装介绍
- React Mixins入门指南
- 2012年CS毕业生
- 计算机三级网络技术知识点大纲,全国计算机等级考试三级网络技术考试大纲(2019年版)...
- Android端的短视频开发技术
- 使用jena 进行RDF推理
- js获得浏览器高度和宽度 参数
- 【AI撬动地球】超级大国政治将让位于跨国AI巨头
- pycharm 添加已有文件
- ESP8266连得上WIFI却连不上手机热点
- html 抽签分小组代码,javascript随机抽签程序
- 什么是互联网营销?看一篇这就够了
- Biba访问控制模型的实现
- 中秋节前能跟客户聊的!
- Navigating to current location (/login) is not allowed
- 电商行业分析指标体系拆解下钻
- ecshop和Ucenter 通信失败终极解决方法!(附带php5.3以上,出现其他问题解决方法)
- 计算机英语(1-30)
热门文章
- blender 命令行渲染
- 【波导】——理解群速度和相速度
- 可视化图布局算法浅析
- BT3下载 与 BT3 U盘版制作
- Linux初级入门百篇--lsof工具
- 要求用户首先输入员工数量,然后输入相应员工信息,格式为: name,age,gender,salary,hiredate 例如: 张三,25,男,5000,2006-02-15 每一行为一个员
- Windows,Ubuntu双系统卸载ubuntu(记录)
- python录制音频
- 计算机文件夹中看不到桌面图标,电脑文件夹内不显示图标
- 安装deepin后没有Windows启动项解决办法