RegExp
前言
正则表达式是很重要的。几乎每一门语言都会去支持正则表达式,ECMAScript是通过RegExp类型来支持正则的。正则其实很常用,比如我们的路由是怎么去相应的匹配页面、在一段文字中提取我想要的文字等等都需要去使用正则。
正则匹配
- 这个正则表达式的pattern(模式)可以是简单活复杂的正则表达式(字符串、限定符、分组、向前查找反向引用)
- 正则表达式可以带0~多个flags(标记)来控制正则表达式的行为。
匹配模式标记
- g :全局模式,表示查找字符的全部内容
- i :不区分大小写,表示查找匹配时忽略pattern和字符串的大小写
- m :多行模式,表示查找到一行文本末尾会继续查找
- y :粘附模式,表示只查找从lastIndex开始及之后的字符串。
- u :Unicode模式 ,启用Unicode匹配
- s :doAll模式,表示元字符,匹配任何字符(包括 n r) 标记也可以组合使用
let pattern = /at/gi
创建正则对象可以用字面量形式或者RegExp构造函数形式
字面量形式
也就是我们上面定义的这种
代码语言:javascript复制let pattern = /at/gi
元字符
代码语言:javascript复制 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。如n匹配换行符
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
* 匹配前面的子表达式0次或多次
匹配前面的子表达式1次或多次
?匹配前面的子表达式0次或1次
. 匹配换行符之外的任何单个字符
x|y 匹配x或y
[xyz] 匹配所包含的任意一个字符
[^xyz] 匹配未包含的任意一个字符
[a-z] 匹配a-z的任意一个小写字母
d 匹配一个数字字符 等价于 [0-9]
D 匹配一个非数字字符 等价于[^0-9]
let pa = /[bc]at/i 匹配第一个"bat"或"cat" ,忽略大小写
let pa = /[bc]at/i 匹配第一个"[bc]at" 忽略大小写
let pa = /.at/gi 匹配所有以"at"结尾的三字符组合,忽略大小写
let pa = /.at/gi 匹配所有".at"忽略大小写
要想使用元字符,必须进行转义。
RegExp构造函数
这种方式,传入的两个参数都是字符串
代码语言:javascript复制let pat = new RegExp("[bc]at","i")
元字符需要二次转意 转义为 \
,如 n \n
字面量模式 对应的字符串
/[bc]at/ "\[bc\]at"
/.at "\.at"
/name/age/ "name\/age"
/d.d{1,2}/ "\d.\d{1,2}"
/w\hello\123/ "\w\\hello\\123"
5.2.1 RegExp实例属性
这些属性可以全面了解正则表达式的信息,但是实际开发并不常用。比如我不需要知道正则表达式中是否使用了g。
- global:布尔值,表示是否设置了 g 标记。
- ignoreCase:布尔值,表示是否设置了 i 标记。
- unicode:布尔值,表示是否设置了 u 标记。
- sticky:布尔值,表示是否设置了 y 标记。
- lastIndex:整数,表示在源字符串中下一次搜索的开始位置,始终从 0 开始。
- multiline:布尔值,表示是否设置了 m 标记。
- dotAll:布尔值,表示是否设置了 s 标记。
- source:正则表达式的字面量字符串(不是传给构造函数的模式字符串),没有开头和结尾的 斜杠。
- flags:正则表达式的标记字符串。始终以字面量而非传入构造函数的字符串模式形式返回(没有前后斜杠)。5.2.2 RegExp实例方法
这里我们介绍两个方法
exec()
和test()
exec()
参数:要应用模式的字符串
需求:内部的匹配项"and baby",内部的 "and dad" 或 "and dad and bay"
代码语言:javascript复制let txt ="mom and dad and baby"
// 注意空格
let pattern = /mom( and dad( and baby)?)?/gi
let match = pattern.exec(txt)
// ['mom and dad and baby', ' and dad and baby', ' and baby', index: 0, input: 'mom and dad and baby', groups: undefined]
- match[0]: 要查找的字符串
- match[1]: 匹配的第一个字符串
- match[2]: 匹配的第二个字符串(当匹配条件是多个的时候)
- match["input"]: 要查找的字符串
- match["index"]: 匹配到字符串的索引思考一下