本文总结自B站UP主胶囊大人的讲解视频,视频网址:
正则表达式30分钟入门40分钟进阶(绝对能学会)_哔哩哔哩_bilibili
1、常用网站:
正则在线测试工具:RegExr: 学习、构建 和 测试 正则表达式 Test RegEx
正则练习:编程胶囊-打造学习编程的最好系统
2、基础篇
字符组:[]
作用:匹配中括号中出现的元素任意一次。
举例:[Pp]ython,可以匹配Python和python。
区间:[a-zA-Z0-9]
作用:正则表达式引擎在字符组中使用连字符(-)
代表区间
举例:匹配任意数字[0-9],匹配所有小写字母[a-z],匹配所有大写字母[A-Z]
匹配特殊字符:\
作用:加\对特殊字符进行转义,例如\-,\(、\)
取反:^
作用:根据不会出现的字符定义字符组,例如[^0-9]除了数字的字符,[^a-z]除了小写字母的字符。
快捷方式
\d等价于[0-9],\w与任意单词字符匹配,任意单词字符表示 [A-Z]
、 [a-z]
、[0-9]
、_(即数字、字母、下划线),\s可以匹配空白字符(空格、tab、换行、换页符),\b表示单词边界,匹配有边界的单词或数字,即单词左右两边不能与其他字母相连(amasterb,master左右两边有a和b,所以不会匹配),数字不能与其他数字相连(31233,123左右有3,所以不能匹配)。
快捷方式取反
\D非数字,\W非字符(非0-9a-zA-Z_),\S非空白。
开始和结束
^表示一个字符串的开始,$表示一个字符串的结束。
^意思是必须从开头开始匹配,$必须从末尾开始匹配,^python开头是python,python$末尾是python。
任意字符:.
表示任意一个字符,他只能出现在方括号外,它只有一个不能匹配的字符,即\n,但在一定条件下可以匹配。
可选字符:?
指定一个字符、字符组或其它基本单元可选,出现1次或0次。
重复:{N}、{m,n},{m,}
在一个字符或字符组后面添加{N},就可以表示它之前的字符或字符组出现了N次。
添加{m,n},表示匹配m~n个,如果有n个,则优先匹配n个,因为正则表达式默认是贪婪模式,会尽可能多地匹配字符,如果要开启非贪婪模式,只需在{}后加?,例如\d{3,4}?
添加{m,},表示匹配m个或无数个,*表示出现大于等于0次,+表示出现大于等于1次。
?的作用:一是表示可选,二是开启非贪婪模式。
.*? 表示匹配任意字符到下一个符合条件的字符
例子:正则表达式a.*?xxx 可以匹配 abxxx axxxxx abbbbbxxx
比如说匹配输入串A: 101000000000100
使用 1.*1 将会匹配到1010000000001, 匹配方法: 先匹配至输入串A的最后, 然后向前匹配, 直到可以匹配到1, 称之为贪婪匹配。
使用 1.*?1 将会匹配到101, 匹配方法: 匹配下一个1之前的所有字符, 称之为非贪婪匹配
3、进阶篇
分组
实现分组使用(),分组有一个非常重要的功能——捕获数据
。所以()
被称为捕获分组,用来捕获数据,当我们想要从匹配好的数据中提取关键数据的时候可以使用分组。
首先要能正确匹配,然后再需要提取数据的部分加上括号()即可。
或者条件
使用分组的同时还可以使用或者(or)条件,(a|b|c|d)
非捕获分组
有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组(?:表达式)
,从而不捕获数据,还能使用分组的功能。
例如想要匹配两个字母组成的单词或者四个字母组成的单词就可以使用非捕获分组:
分组的回溯引用
<font>aaa</bar>这种匹配会提取出错误的信息,那怎么保证匹配正确
原来的:<\w+>(.*?)</\w+>,正确的:<(/w+)>(.*?)</\1>
\1代表第一个分组,\2代表第2个分组。
先行断言
正向先行断言:(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式。
例如,喜欢(?=你),喜欢的右边必须是你,但提取的内容不包括你
反向先行断言:(?!表达式)
的作用是保证右边不能出现某字符。
例如: 我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:喜欢(?!你)
,这就是反向先行断言。
后行断言
先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。
正向后行断言:(?<=表达式)
,指在某个位置向左看,表示所在位置左侧必须能匹配表达式
例如:如果要取出喜欢两个字,要求喜欢的前面有我,后面有你,这个时候就要这么写:(?<=我)喜欢(?=你)
。
反向后行断言:(?<!表达式)
,指在某个位置向左看,表示所在位置左侧不能匹配表达式
例如:如果要取出喜欢两个字,要求喜欢的前面没有我,后面没有你,这个时候就要这么写:(?<!我)喜欢(?!你)
。