以前看过一两遍,长时间不用就又忘了,学习js知识的时候总是把正则表达式部分略过。在工作中发现用到正则表达式的地方越来越多。开启正则表达式学习。
1、RegEep对象
javascript 通过内置对象RegExp支持正则表达式。 实例化RegExp对象的两种方法:
- 字面量
- 构造函数 例子 var reg = /\bis\b/g; var reg1 = new RegExp('\bis\b', 'g')
因为构造函数的模式参数都是字符串,所以所有的元字符都需要双重转译
tips: 如果写完一个正则表达式,想看下写的是否正确可以通过https://regexper.com 查看
2、 正则表达式修饰符
| 修饰符 | 含义 |
|---|---|
| g | 全局搜索 |
| i | 忽略大小写 |
| m | 多行搜索 |
| y | 粘连(与g同时使用,es6新增) |
3、元字符
正则表达式由两种基本字符类组成:
- 原义文本字符 (例如 abc 123)
- 元字符 (元字符是在正则表达式中的有特殊含义的非字母字符)
| 元字符 | 含义 |
|---|---|
| . | |
| * | |
| + | |
| ? | |
| $ | |
| ^ | |
| | | |
| \ | |
| () | |
| {} | |
| [] |
4、 字符类
我们可以使用元字符[]来构建一个简单的类(类是指符合某些特性的对象,一个泛指而不是特指某个字符
表达式[abc]把字符a或b或c归为一类,表达式可以匹配这类字符
5、 字符类取反
使用元字符^创建 反向类/负向类
表达式[^abc]表示不是字符a或b或c的内容
6、 范围类
使用字符类匹配数字 [0123456789]
我们可以使用[0-9]来连接两个字符表示从1到9
在[]组成的类内部是可以连写的[a-zA-Z],表示小写a-z和大写A-Z
7、 预定义类及边界
正则表达式提供预定义类来匹配常见的字符类
7.1 预定义类
| 字符 | 等价类 | 含义 |
|---|---|---|
| . | [^\r\n] | 除了回车符和换行符之外的所有字符 |
| \d | [0-9] | 数字字符 |
| \D | [^0-9] | 非数字字符 |
| \s | [\t\n\xOB\f\r] | 空白符 |
| \S | [^\t\n\xOB\f\r] | 非空白字符 |
| \w | [a-zA-Z_0-9] | 单词字符(字母、数字下划线) |
| \W | [^a-zA-Z_0-9] | 非单词字符 |
7.2 边界
| 字符 | 等价类 |
|---|---|
| ^ | 以xxx开始 |
| $ | 以xxx结束 |
| \b | 单词边界 |
| \B | 非单词边界 |
8、 量词
例如我们希望匹配一个连续出现10数字的字符串 \d\d\d\d\d\d\d\d\d\d (无法忍受啦)
| 字符 | 含义 |
|---|---|
| ? | 出现0次或一次(最多出现一次) |
| + | 出现一次或者多次 (至少出现一次) |
| * | 出现0次或者多次(任意次) |
| {n} | 出现n次 |
| {n,m} | 出现n到m次 |
| {n,} | 至少出现n |
9 贪婪模式与非贪婪模式
顾名思义:贪婪模式就是尽可能多的去匹配,非贪婪模式就是最少匹配
例如:\d{3,6} 123456789 结果回匹配出 123456
非贪婪模式,在量词后加上?即可
10、分组
例如:hello连续出现五次,我们可能会写 hello{5},这样写,只是后面的o出现5次,并不是我们预期
使用()可以达到分组的功能,使量词作用于分组
(hello){3}即可满足我们需求
或
正则表达式用| 可以达到或的效果 例如 hello|world
反向引用
可以用$来捕获到分组
忽略分组
不想捕获某些分组,只需在分组内加上?:就可以 (?:hello).(ok)
11、前瞻
正则表达式从文本头部向尾部开始解析,文本尾部方向,称为‘前’ 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言 后顾/后瞻 方向相反(js不支持)
| 名称 | 正则 |
|---|---|
| 正向前瞻 | exp(?=assert) |
| 负向前瞻 | exp(?!assert) |
12、js对象属性
- global: 是否全文搜索,默认false
- ignoreCase: 是否大小写敏感,默认false
- multiline: 多行搜索,默认值false
- lastIndex: 是当前表达式匹配内容的最后一个字符的下一个位置
- source: 正则表达式的文本字符串
13、test和exec方法
test
- 用于测试字符串参数中是否存在匹配正则表达式模式的字符串
- 如果存在则返回true,否则返回false const reg1 = /\w/ reg1.test('a') -> true reg1.test('b') -> true reg1.test('c') -> true const reg2 = /\w/g reg2.test('a') -> true reg2.test('b') -> false reg2.test('b') -> true 因为lastIndex属性在g情况下,匹配完,lastIndex会返回匹配字符下一个字符的位置
exec方法
- 使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果
- 如果没有匹配的文本返回null,否则返回一个结果数组。
- exec() 方法还返回两个属性
- index声明匹配文本的第一个字符的位置
- input存放被检索的字符串string
14、字符串对象方法
search方法
match 方法
split 方法
replace 方法
match方法 replace(str,replaceStr) replace(reg,replaceStr) replace(reg,function) 在非全局下match,和exec功能一样,在全局下只是返回一个匹配数组,也没有分组信息了。 function参数含义 function会在每次匹配替换的时候调用,有四个参数
1、匹配字符串
2、正则表达式分组内容,没有分组则没有该参数
3、匹配项在字符串中的index
4、原字符串