定义
正则表达式(Regular Expression)
用某种模式去匹配一类字符串的公式,主要用来描述字符串匹配的工具。
匹配
文本或字符存在不止一个部分满足给定的正则表达式,这是每一个这样的部分都被称为一个匹配。 匹配分为以下三种类型:
- 形容词性的匹配
即一个字符串匹配一个正则表达式 - 名词性的匹配
即在文本或字符串里匹配正则表达式 - 名词性的匹配
即字符串中满足给定的正则表达式的一部分
元字符
元字符(Metacharacter)是一类非常特殊的字符,它能够匹配一个位置或字符集合中的一个字符,元字符可以分为两种类型
- 匹配位置的元字符
- 匹配字符的元字符
元字符只能匹配一个字符位置,也就是一个匹配的单位是一个字符,而不是一个字符串
匹配位置的元字符
| 字符 | 说明 |
|---|---|
| ^ | 匹配行开始 |
| $ | 匹配行结束 |
| b | 匹配单词的开始或结束 不支持中文 |
测试
- ^a
匹配第一个字母为a的一行
- a$
匹配最后一个字母为a的一行
- ^a$
匹配只有一个字母a的一行
- bStr
匹配以Str为开头的单词
- ingb
匹配以ing为结尾的单词
- bStringb
仅匹配String这个单词
匹配第一个字母为a的一行
匹配最后一个字母为a的一行
匹配只有一个字母a的一行
匹配以Str为开头的单词
匹配以ing为结尾的单词
仅匹配String这个单词
b字符如何识别哪个是单词呢?
以标点符号或空格分隔的字符串将被识别为单词,而且 b只能用于英文,不能用于中文
匹配字符的元字符
元字符都是按照单个字符进行匹配
| 字符 | 说明 |
|---|---|
| . (点号) | 匹配除换行符之外的任意字符 |
| w | 匹配任意单词字符(字母,数字,下划线) |
| W | 匹配任意非单词字符 |
| s | 匹配任意空白字符(空格,制表符,换行符,中文全角空格) |
| S | 匹配任意非空白字符 |
| d | 匹配任意数字 0~9的任意一个数字 |
| D | 匹配任意非数字 |
测试
- .
全部字符匹配
- w
匹配了全部的单词字符,除了下划线之外的标点符号和汉字都被排除在外
- W
匹配结果和w刚好相反,注意那个下划线是属于单词字符的
- s
有2个空格被匹配,注意!这里总共有6个符号被匹配了,除了两个空格还有1~4行末的换行符
- S
除了2个空格和4个换行符,其余字符全部匹配
- d
匹配所有的数字
- D
匹配所有数字之外的字符
元字符组合
全部字符匹配
匹配了全部的单词字符,除了下划线之外的标点符号和汉字都被排除在外
匹配结果和w刚好相反,注意那个下划线是属于单词字符的
有2个空格被匹配,注意!这里总共有6个符号被匹配了,除了两个空格还有1~4行末的换行符
除了2个空格和4个换行符,其余字符全部匹配
匹配所有的数字
匹配所有数字之外的字符
仅仅是元字符就可以自由组合来实现不同的匹配效果
- ww
匹配连续的两个单词字符
- ws
注意第三行最后匹配的m是和行末的换行符一起匹配成功的
文字匹配
字符类
字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它会找到该匹配项。
- []
字符类使用中括号作为标志,字符集合写在中括号里面,意为匹配中括号中的任意一个字符 - -
- 当-符号不是第一个字符的时候表示定义字符的范围*,例如[1-3]表示[123],[a-z]表示匹配任意小写字母,如果-放在第一位,那就仅表示自己,这个范围的顺序和两个字符间的内容是按照ASCII表的顺序决定的,例如[9-1]是违反ASCII表顺序的一个表达式,这会报错
- ^
如果放在字符类第一个,表示该字符类的否定,[^123]表示匹配1、2、3之外的所有数字 - 元字符在字符类中不做任何特殊处理,仅仅表示他们自身
测试
- [aeiou]
匹配元音字母 - [a-z]
匹配从小写字母a到z之间的所有字母 - [^aeiou]
匹配元音字母之外的所有字符(包括任意符号) - [^a-z]
匹配小写字母a到z之间的所有字母之外的所有字符 - [0-9]
匹配从0到9之间的任意一个数字 - [ao-u]
匹配a和o到u之间的所有字母,可以看到只要在连个字符之间使用连接符-就会判断为一个区间 - [!-?]
匹配从!到?之间的任意一个符号,可以看到因为是按照ASCII表顺序来判断-连接的字符集合,所以这样写也是没有问题的 - [a^-]
匹配字符a、^和-三个字符,只要^符号不在第一位,-符号不在两个字符中间,那么它们就只表示自身 - a[no]
匹配字符串an或ao,这是字符类和元字符的组合
字符转义
匹配元音字母
匹配从小写字母a到z之间的所有字母
匹配元音字母之外的所有字符(包括任意符号)
匹配小写字母a到z之间的所有字母之外的所有字符
匹配从0到9之间的任意一个数字
匹配a和o到u之间的所有字母,可以看到只要在连个字符之间使用连接符-就会判断为一个区间
匹配从!到?之间的任意一个符号,可以看到因为是按照ASCII表顺序来判断-连接的字符集合,所以这样写也是没有问题的
匹配字符a、^和-三个字符,只要^符号不在第一位,-符号不在两个字符中间,那么它们就只表示自身
匹配字符串an或ao,这是字符类和元字符的组合
之前介绍的元字符非常好用,但是这又引出了一个问题,如果我们想在正常的表达式里面使用元字符本身这个符号怎么办呢?难道每次都要写在字符类里面吗?
当然不,这里就引出了我们的字符转义
正则表达式定义了一些特殊的元字符,如^、$、.等。由于这些字符在正则表达式中被解释成其他指定的含义,如果需要匹配这些字符,则需要使用字符转义来解决这个问题。转义字符使用符号(反斜杠),它可以取消这些字符(如^、$、.等)在表达式中具有的特殊意义。
- .
匹配字符. - *
匹配字符*
匹配字符- www.lanyuanxiaoyao.com
匹配字符串www.lanyuanxiaoyao.com,网址中的dot符号也是需要转义的
常用转义字符
| 字符或表达式 | 说明 |
|---|---|
| a | 响铃(警报) u0007 |
| b | 在正则表达式中,表示单词的边界;如果在字符类中,则表示退格符u0008 |
| t | 制表符u0009 |
| r | 回车符u000D |
| v | 垂直制表符u000B |
| f | 换页符u000C |
| n | 换行符u000A |
| e | 回退(ESC)符u001B |


