红宝书

2023-01-12 13:37:06 浏览数 (1)

RegExp

前言

正则表达式是很重要的。几乎每一门语言都会去支持正则表达式,ECMAScript是通过RegExp类型来支持正则的。正则其实很常用,比如我们的路由是怎么去相应的匹配页面、在一段文字中提取我想要的文字等等都需要去使用正则。

正则匹配

  • 这个正则表达式的pattern(模式)可以是简单活复杂的正则表达式(字符串、限定符、分组、向前查找反向引用)
  • 正则表达式可以带0~多个flags(标记)来控制正则表达式的行为。

匹配模式标记

  • g :全局模式,表示查找字符的全部内容
  • i :不区分大小写,表示查找匹配时忽略pattern和字符串的大小写
  • m :多行模式,表示查找到一行文本末尾会继续查找
  • y :粘附模式,表示只查找从lastIndex开始及之后的字符串。
  • u :Unicode模式 ,启用Unicode匹配
  • s :doAll模式,表示元字符,匹配任何字符(包括 n r) 标记也可以组合使用
代码语言:javascript复制
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

代码语言:javascript复制
字面量模式                    对应的字符串

/[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"]: 匹配到字符串的索引思考一下

    0 人点赞