是一种非常强大的文本搜索模式

创建:

  • 构造函数: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