正则表达式入门部分
一、字符组
- 定义:字符组
[]
允许匹配一组可能出现的字符。 - 案例:
- 答案:
[Jj]ava8.0
- 注:[]默认只会匹配字符组中的一个字符。
二、区间
- 定义:正则表达式引擎在字符组中使用连字符(
-
)代表区间。 - 案例:
- 答案:
[a-z0-9A-Z]+
- 注:a-z代表的是abcdef…z,0-9代表的是0123456789等,但是
[]
只会代表一个,所以后面的+
代表的是重复出现的次数为:1-多次
三、特殊字符转义符
- 定义:对于一些含有特殊意义的字符,如
-
,有时候需要匹配的符号就是-
号,该怎么办呢? - 案例:
- 答案:
[\[\-\(][\-\]\)]+
- 注:对于这些特殊字符,需要
\
进行转义。
四、字符组取反
- 定义:我们定义的字符组都是由可能出现的字符定义,不过有时候我们可能希望根据不会出现的字符定义字符组。
- 案例:匹配不包含数字的字符组
- 答案:
[^0-9]
- 注:
^
表示匹配的一个字符是不包含数字的,可能是一个小写字母,也可能是一个大写字母。
五、快捷方式
5.1 匹配单词字符、数字
- 定义:
- 案例:
- 答案:
\w+
5.2 匹配空白
- 定义:
\s
快捷方式可以匹配空白字符,比如空格,tab、换行等。 - 案例:
- 答案:
code\s.*
5.3 匹配单词边界
- 定义:
\b
匹配的是单词的边界 - 案例:
- 答案:
\bcode\b
- 注:匹配的单词的边界,像上面的codeasd就不会被匹配到。
5.4、快捷方式取反
- 定义:快捷方式也可以取反,例如对于
\w
的取反为\W
,将小写改写成大写即可,其他快捷方式也遵循这个规则. - 案例:请使用正则表达式匹配下列开头不以字母开头的单词。
- 答案:
\W\w+
5.5、开始和结束
- 定义:正则表达式中
^
指定的是一个字符串的开始,$
指定的是一个字符串的结束。 - 案例:请编写正则表达式匹配以
OS
结尾的字符串。 - 答案:
\w+\s?OS$
5.6、任意字符
- 定义:
.
字符代表匹配任何单个字符,它只能出现在方括号以外
。 - 案例:匹配任意字母之后是ar的字符串
- 答案:
.+ar
5.7、可选字符
- 定义:有时,我们可能想要匹配一个单词的不同写法,比如
color和colour,或者honor与honour
。这个时候我们可以使用? 符号
指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。
- 案例:请你使用正则来匹配
favorite
和favourite
这两种写法。 - 答案:
favou?rite
六、匹配多个字符
6.1、重复
- 定义:我们只是学习了关于仅出现
一次的字符串匹配
,在实际开发中,肯定不能满足需求,比如要匹配电话号码、身份证的时候就无法满足需求了。在一个字符组后加上{N}
就可以表示在它之前的字符组出现N
次. - 案例:
- 答案:
\d{3}-\d{5}
6.2、重复区间
- 定义:有时候,我们不知道具体要匹配字符组要重复的次数,比如身份证有15位也有18位的。这里重复区间就可以出场了,语法:
{M,N}
,M是下界而N是上界
。 - 案例:
- 答案:
\d{3,4}-\d{7}
注:\d{3,4}
既可以匹配3个数字也可以匹配4个数字,不过当有4个数字的时候,优先匹配的是4个数字,这是因为正则表达式默认是贪婪模式
,即尽可能的匹配更多字符,而要使用非贪婪模式
,我们要在表达式后面加上 ?号
。
6.3、开闭区间
- 定义:我们可能遇到字符组的重复次数没有边界,闭区间不写即可表示匹配一个或无数个,格式为
{1,}
. - 案例:请使用正则表达式匹配以
f
开头的数据。 - 答案:
f.+
- 注:
+
等价于{1,}
,*
等价于{0,}
七、入门总结
7.1、多种匹配模式
7.2、快捷方式
正则表达式进阶部分
一、分组
- 定义:在正则表达式中还提供了一种将表达式
分组
的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。
要实现分组很简单,使用()
即可。
分组有一个非常重要的功能——捕获数据。所以()被称为捕获分组
,用来捕获数据,当我们想要从匹配好的数据中提取关键数据的时候可以使用分组
。
- 案例:
- 答案:
<div>(.*?)</div>
- 注:
.*?
的意思是任意字符,并且可有可无。
1.1 或者条件|
- 定义:使用分组的同时还可以使用
或者(or)
条件。 - 案例:视频文件的后缀名有
.mp4、.avi、.wmv、.rmvb
请编写正则表达式提取所有的视频文件的后缀 - 答案:
.*(\.mp4|\.avi|\.wmv|\.rmvb)
1.2 非捕获分组(?:表达式)
- 定义:有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。这个时候就可以使用非捕获组
(?:表达式)
,从而不捕获数据,还能使用分组的功能。 - 案例:提取目标数据中的电话号码
- 答案:
(?:.+)[\-\:](\d+)
1.3 分组的回溯引用
- 定义:正则表达式还提供了一种引用之前匹配分组的机制,有些时候,我们或许会寻找到一个子匹配,该匹配接下来会再次出现。如果想让后面分组的正则和第一个分组的正则匹配同样的数据该如何做呢?可以使用
分组的回溯引用
,使用\N
可以引用编号为N的分组
. - 案例:
- 答案:
(\w{2,})\1
二、先行断言
2.1 正向先行断言
- 定义:
(?=表达式)
,指在某个位置向右看
,表示所在位置右侧必须能匹配表达式. - 案例:
我喜欢你
我喜欢
我喜欢我
喜欢
喜欢你
如果要取出喜欢
两个字,要求这个喜欢
后面有你
,这个时候就要这么写:喜欢(?=你)
,这就是正向先行断言。
2.2 反向先行断言
- 定义:反向先行断言
(?!表达式)
的作用是保证右边不能出现
某字符。 - 案例:编写正则表达式匹配不是qq邮箱的数据。
- 答案:
.*@(?!qq).*
三、后行断言
- 先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。
3.1 正向后行断言
- 定义:
正向后行断言:(?<=表达式)
,指在某个位置向左看,表示所在位置左侧必须能匹配表达式. - 案例:使用正则表达式匹配匹配王姓同学的名字。
- 答案:
.*?(?<=王).+
3.2 反向后行断言
- 定义:
(?<!表达式)
,指在某个位置向左看,表示所在位置左侧不能匹配表达式. - 案例:请使用正则表达式匹配一个
$
符号中的数据。 - 答案:
\$.*(?<!\$)\$$
学习视频:https://www.bilibili.com/video/BV19t4y1y7qP?p=1
正则练习网址: https://www.codejiaonang.com/
正则在线测试网站: https://regexr-cn.com/