是一种非常强大的文本搜索模式
创建:
- 构造函数:
new RegExp( pattern[, flags] ) - 字面量:
/pattern/flags
区别:转义时
- 字面量中,如果特殊字符作为用途,那么需要反斜杠转义
\ - 但是构造函数传入的是字符串,因为自带转义,所以需要使用 2 个反斜杠
\\
修饰符(flags)
| 修饰符 | 功能 | 影响 |
|---|---|---|
g | 寻找所有匹配项,不加只会查找第一项 | |
i | 搜索时不区分大小写 | |
m | 多行字符串模式 | 锚点(^ $) |
sES2018 | 点 . 匹配换行符 | . |
uES6 | 开启完整的 Unicode 支持 | 可以使用 ⇒ \p{...} |
yES6 | 在文本中的确切位置搜索 |
字符类
| 字符类 | 含义 | 表示内容 |
|---|---|---|
\d | 数字 | [0-9] |
\w | 拉丁字母或数字或下划线 | [0-9a-zA-Z_] |
\s | 空白符号 | [ \t\n\r\v\f] |
. | 除换行符之外的任何字符 | [^\n\r\u2028\u2029] |
\D,\W,\S:表示除\d,\w,\s以外的任何字符
要匹配任意字符,有 2 种方案:
- 使用:
/[\s\S]/ - 使用修饰符:
/./s
锚点
字符串开始 ^ 和末尾 $:用于测试字符串是否严格以某个字符开头和结尾
多行模式 m 修饰符:不仅仅匹配文本的开始与末尾,还匹配每一行的开始与末尾
词边界
有三种不同的位置可作为词边界 \b:
- 在字符串开头,如果第一个字符是
\w - 在字符串中的两个字符之间,其中一个是
\w,另一个不是 - 在字符串末尾,如果最后一个字符是
\w
词边界和锚点一样,是一种位置检查,并不匹配任何实际的字符
集合
表示匹配其中的一个
[...]:表示搜索方括号中的一个[0-9a-z]:范围表示[^...]:排除范围
量词
在 字符,字符类,集合,捕获组 后面可以加上量词表示重复的次数
{n}:重复 n 次{a,b}:范围,大于等于 a 个,小于等于 b 个{a,}:大于等于 a 个*:{0,}零个或多个+:{1,}一个或多个?:{0,1}零个或一个
量词默认是 贪婪模式 搜索的:会匹配到能匹配的最后一个字符,然后再寻找下一个要匹配的内容,如果不满足则依次回退一个字符继续匹配
惰性模式:在量词后面再添加一个问号 ?,会尽可能少地匹配满足项
捕获组
(...) 将正则中的一部分用括号括起来视为一个整体,主要功能:
- 将匹配的一部分作为结果数组中的单独项
- 将量词放在括号后,则它将括号视为一个整体
命名组:(?<name>...)ES2018
- 在 str.replace 中第二个参数可以使用
$<name>表示之前匹配到的组,没有名称则用$1,$2… 代替 - 在正则表达式中可以使用
\k<name>表示之前匹配到的组,也可以使用\1\2… 表示之前匹配到的捕获组
非捕获组:(?:x)
匹配 x 但是不记住 x,不作为捕获结果,也不能在后面用名称代替
选择
|:表示 或
断言
通常用于需要匹配某个条件,但又不希望包含那些条件本身作为匹配结果时的场景
| 模式 | 类型 | 匹配 |
|---|---|---|
| 先行断言 | x(?=y) | 匹配 x,仅当 x 后面 紧跟着 y |
| 先行否定断言 | x(?!y) | 匹配 x,仅当 x 后面 不紧跟着 y |
| 后行断言 | x(?<=y) | 匹配 x,仅当 x 前面 紧跟着 y |
| 后行否定断言 | x(?<!y) | 匹配 x,仅当 x 前面 不紧跟着 y |
常用方法
正则
regexp.exec( str ):返回字符串 str 中的 regexp 匹配项
如果没有修饰符
g:会返回第一个匹配项,像 str.match(regexp) 一样
如果有修饰符g:调用后会返回第一个匹配项,并将紧随其后的位置保存在属性 regexp.lastIndex 中,下一次这样的调用会从位置 regexp.lastIndex 开始搜索。如果没有匹配项,则返回 null,并将 regexp.lastIndex 重置为 0
regexp.test( str ):判断字符串是否匹配正则,返回 true/false
带有修饰符 g,则从 regexp. lastIndex 属性开始查找并更新此属性,就像 regexp. exec 一样
字符串
str.match( regexp ):在字符串 str 中查找 regexp 的匹配项
不带修饰符
g:返回第一个匹配项,包含:匹配到的值,捕获组,匹配到的位置,原字符串
带修饰符g:返回一个包含所有匹配项的数组,但不包含捕获组和其它详细信息
没有匹配项,则无论是否带有修饰符g,都将返回 null
str.matchAll( regexp ):用来搜索所有匹配项
返回一个包含匹配项的可迭代对象
每个匹配项均以一个包含完整匹配信息的数组形式返回
果没有结果,则返回的是一个空的可迭代对象而不是 null
-
str.split( regexp|substr, limit ):可以使用正则表达式作为分隔符来分割字符串 -
str.search( regexp ):返回第一个匹配项的位置,如果没找到,则返回 -1(仅查找第一个匹配项) -
str.replace( str|regexp, str|func ):搜索和替换的通用方法 -
str.replaceAll( str|regexp, str|func ):替换所有的,必须有修饰符g