正则表达式及进阶
简介
正则表达式可以匹配某些特定的数据,如果你想要从庞大的文字信息中提取出一小段你需要的数据,那么正则表达式或许能帮到你。
例如:输入code就可以匹配所有包含code的数据。
字符组
字符组([]
)允许匹配一组可能出现的字符。
可以发现[Pp]
既可以匹配大写的P
也可以匹配小写的p
区间
- 要匹配任意数字可以使用
[0-9]
; - 如果想要匹配所有小写字母,可以写成
[a-z]
; - 想要匹配所有大写字母可以写成
[A-Z]
。
匹配特殊字符
正则表达使用了 -
号代表了区间,需要对-
号进行转义操作,即 \-
。
取反
通过在字符数组开头使用 ^
字符实现取反操作,意味着会匹配任何指定字符之外的所有字符,爱[^你]的意思就是爱的后面的字母不能是你。
快捷匹配数字和字母
快捷方式 | 描述 |
---|---|
\w | 与任意单词字符匹配,任意单词字符表示 [A-Z] 、 [a-z] 、[0-9] 、_ |
\d | 与任意数字匹配 |
\s | 匹配空白字符,比如空格,tab,换行等 |
\W | 快捷方式取反,将小写改为大写。 |
开始和结束
正则表达式中 ^
指定的是一个字符串的开始,$
指定的是一个字符串的结束。
任意字符
.
字符代表匹配任何单个字符,它只能出现在方括号以外。.
字符只有一个不能匹配的字符,也就是换行符(\n
)。
可选字符
可以使用 ?
符号指定一个字符、字符组或其他基本单元可选,这意味着正则表达式引擎将会期望该字符出现零次或一次。
例如:u?
表示u
是可选的,即可以出现也可以不出现。
重复
在一个字符组后加上{N}
就可以表示在它之前的字符组出现N
次。
重复区间
\d{3,4}
既可以匹配3
个数字也可以匹配4
个数字,不过当有4
个数字的时候,优先匹配的是4
个数字,这是因为正则表达式默认是贪婪模式,即尽可能的匹配更多字符,而要使用非贪婪模式,我们要在表达式后面加上 ?
号。
开闭区间
+等价于{1,},*等价于{0,}
分组
在正则表达式中还提供了一种将表达式分组的机制,当使用分组时,除了获得整个匹配。还能够在匹配中选择每一个分组。
要实现分组很简单,使用()
即可。
例如:
这段正则表达式将文本分成了两组,第一组为:0731
,第二组为8825951
。
分组有一个非常重要的功能——捕获数据
。所以()
被称为捕获分组,用来捕获数据,当我们想要从匹配好的数据中提取关键数据的时候可以使用分组。
(\d{4})
和 (\d{7})
就分别捕获了两段数据:
0731
8825951
或者条件
使用分组的同时还可以使用 或者(or
)条件。
例如要提取所有图片文件的后缀名,可以在各个后缀名之间加上一个 |
符号:
非捕获分组
(?:表达式)
,从而不捕获数据,还能使用分组的功能。
例如想要匹配两个字母组成的单词或者四个字母组成的单词就可以使用非捕获分组:
分组的回溯引用
使用\N
可以引用编号为N
的分组,因此上述例子的代码我们可以改为:
通过这个例子,可以发现 \1
表示的就是第一个分组,在这里第一个分组匹配的是 font
所以\1
就代表font
。
例如:匹配符合 ab
ba
这种关系的单词,使用(\w+)(\w+)\2\1进行捕获
正向先行断言
很多人也称先行断言和后行断言为环视,也有人叫预搜索,其实叫什么无所谓,重要的是知道如何使用它们!
先行断言和后行断言总共有四种:
- 正向先行断言
- 反向先行断言
- 正向后行断言
- 反向后行断言
正向先行断言:(?=表达式)
,指在某个位置向右看,表示所在位置右侧必须能匹配表达式
例如:
我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面有你,这个时候就要这么写:喜欢(?=你)
,这就是正向先行断言。
反向先行断言
反向先行断言(?!表达式)
的作用是保证右边不能出现某字符。
例如: 我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你
如果要取出喜欢两个字,要求这个喜欢后面没有你,这个时候就要这么写:喜欢(?!你)
,这就是反向先行断言。
总结:先行断言和后行断言只有一个区别,即先行断言从左往右看,后行断言从右往左看。
正向后行断言
正向后行断言:(?<=表达式)
,指在某个位置向左看,表示所在位置左侧必须能匹配表达式
反向后行断言
反向后行断言:(?<!表达式)
,指在某个位置向左看,表示所在位置左侧不能匹配表达式
正则表达式推荐学习加练习网站编程胶囊-打造学习编程的最好系统 (codejiaonang.com)