是一种非常强大的文本搜索模式
创建:
- 构造函数:
new RegExp( pattern[, flags] )
- 字面量:
/pattern/flags
区别:转义时
- 字面量中,如果特殊字符作为用途,那么需要反斜杠转义
\
- 但是构造函数传入的是字符串,因为自带转义,所以需要使用 2 个反斜杠
\\
修饰符(flags)
修饰符 | 功能 | 影响 |
---|---|---|
g | 寻找所有匹配项,不加只会查找第一项 | |
i | 搜索时不区分大小写 | |
m | 多行字符串模式 | 锚点(^ $ ) |
s ES2018 | 点 . 匹配换行符 | . |
u ES6 | 开启完整的 Unicode 支持 | 可以使用 ⇒ \p{...} |
y ES6 | 在文本中的确切位置搜索 |
字符类
字符类 | 含义 | 表示内容 |
---|---|---|
\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