正则表达式入门:
1、匹配某些特定的数据:
例如:输入code就可以匹配所有包含code的数据;
2、字符组:
如果只是使用正则表达式来匹配文本,没有什么意义,毕竟检测一个文本中是否有另一个字符串本来就非常简单。正则表达式强大的地方在于它可以迅速地用极简单的方式达到字符串的复杂控制。字符组([])允许匹配一组可能出现的字符。例如:[Pp]ython. [Jj]ava.
3、匹配多个单词:
例如 [Rr]ub[ye] 可以匹配字符组匹配Ruby、Rube、ruby、rube。
4、区间:
连字符(-)代表区间
a.要匹配任意数字可以使用[0-9];
b.如果想要匹配所有小写字母,可以写成[a-z];
c.想要匹配所有大写字母可以写成[A-Z]。
5、匹配特殊字符:
在正则中使用 \ 就可以进行对特殊符号进行转义,对 - 进行转义就可以表示为 \-,即 \- 就代表了 - 号本身。
6、匹配字母:
[]字符组中可以放多个条件例如,想要匹配数字和小写字母可以这样写:[0-9a-z]。
7、取反 ^
8、快捷匹配数字和字母
\w可以与任意单词字符匹配,[a-z],[A-Z],[0-9],_。
\d匹配任意数字。
\s快捷方式可以匹配空白字符,比如空格,tab、换行等。
9、单词边界
\b 匹配的是单词的边界
\bmaster\b 就仅匹配有边界的master单词。
10、快捷方式取反
快捷方式也可以取反,例如对于\w的取反为\W,将小写改写成大写即可,其他快捷方式也遵循这个规则。
11、开始和结束
正则表达式中 ^指定的是一个字符串的开始,$指定的是一个字符串的结束。
12、任意字符
.字符代表匹配任何单个字符,它只能出现在方括号以外。
值得注意的是: .字符只有一个不能匹配的字符,也就是换行符(\n),不过要让.字符与换行符匹配也是可以的,以后会讨论。[.\n]
13、可选字符
有时,我们可能想要匹配一个单词的不同写法,比如color和colour,或者honor与honour。这个时候我们可以使用 ? 符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。例如:honou?r 在这里 u? 表示u是可选的,即可以出现也可以不出现,可以匹配的是 honor 和 honour 。通过这个案例可以知道?的作用就是匹配它之前的字符0次或1次。
14、重复
在一个字符组后加上{N} 就可以表示在它之前的字符组出现N次。
15、重复区间
\d{3,4} 既可以匹配3个数字也可以匹配4个数字,不过当有4个数字的时候,优先匹配的是4个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ?号。\d{3,4}?
16、开闭区间
使用两个速写字符指定常见的重复情况,可以使用 + 匹配1个到无数个,使用 *代表0个到无数个。
正则表达式进阶:
17、分组:()
分组有一个非常重要的功能——捕获数据。
当我们想要从匹配好的数据中提取关键数据的时候可以使用分组。
18、提取p标签中的数据
<p>(.*)</p> <p>123</p>
19、提取学号:2019-5013-08
(\d{4})[\-\s]?(\d{4})[\-\s]?(\d{2})
20、提取年月日
(\d{4})[\-\/](.*)[\-\/](.*)
21、或者条件
使用分组的同时还可以使用或者(or)条件。
例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个 | 符号:
22、非捕获分组
有时候,我们并不需要捕获某个分组的内容,但是又想使用分组的特性。
这个时候就可以使用非捕获组(?:表达式),从而不捕获数据,还能使用分组的功能。
(?:\w.*)[\-\:](\d{5})
23、分组的回溯引用
正则表达式还提供了一种引用之前匹配分组的机制,有些时候,我们或许会寻找到一个子匹配,该匹配接下来会再次出现。可以使用分组的回溯引用,使用\N可以引用编号为N的分组;
(\w)(\w)(\2)(\1)
24、正向先行断言
(?=表达式),指在某个位置向右看,表示所在位置右侧必须能匹配表达式
先行断言可以用来判断字符串是否符合特定的规则,例如提取包含至少一个大小写字母的字符串:(?=.*?[a-z])(?=.*?[A-Z]).+
25、反向先行断言
反向先行断言(?!表达式)的作用是保证右边不能出现某字符。Eg:匹配标签
26、正向后行断言
先行断言和后行断言只有一个区别,即先行断言从左右看,后行断言从右往左看。
正向后行断言:(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式
27、反向后行断言
(?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式