1. 创建

字面量形式

  1. var expression = / pattern / flags;

new 操作符加 RegExp 构造函数创建

  1. var pattern = new RegExp("pattern", "flags");

其中 flags 为可选参数

  • pattern 部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用

  • flags 标志,每个正则表达式都可带有一或多个标志,以表明正则表达式的行为

    • g 表示全局模式,即模式将被应用于所有字符串、而非在发现第一个匹配项时立即停止

    • i 表示不区分大小写模式,即在确定匹配项时忽略模式与字符串的大小写

    • m 表示多行模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。

2. 元字符

元字符在正则表达式中都有一种或多种特殊用途,如果想要匹配的字符串包含这些字符,都必须转义。

元字符有:

  1. { ( [ \ ^ $ | ? * + . ] ) }

字面量形式:

// 匹配第一个 "bat" 或 "cat",不区分大小写
var pattern1 = /[bc]at/i;

// 匹配第一个 "[bc]at",不区分大小写
var pattern2 = /\[bc\]at/i;

new 操作符形式,需要双重转义,不只是元字符,那些已经转义过的字符也是如此

var pattern = new RegExp("\\[bc\\]at", "i");

3. RegExp 实例属性

通过这些属性可以获知一个正则表达式的各方面信息,但是却没有多大用处,因为这些信息全部包含在模式声明中

3.1 global

布尔值,判断是否设置了 g 标志

3.2 ignoreCase

布尔值,判断是否设置了 i 标志

3.3 lastIndex

整数,表示开始搜索下一个匹配项的字符位置,从 0 算起

3.4 multiline

布尔值,表示是否设置了 m 标志

3.5 source

正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回

4. RegExp 实例方法

4.1 exec()

RegExp 对象的主要方法是 exec(),专门为捕获组而设计的

接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组,或者在没有匹配项的情况下返回 null

返回的虽然是 Array 的实例,却包含两个额外属性: indexinput

  • index 表示匹配项在字符串中的位置

  • input 表示应用正则表达式的字符串

返回的数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果没有捕获组,则只有一项)

var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
console.log(matches); 
//  ["mom and dad and baby", " and dad and baby", " and baby", index: 0, input: "mom and dad and baby"]
  • 设置了全局标志 g,它每次也只会返回一个匹配项,多次调用,则会在同一字符串中继续查找新的匹配项。此时,lastIndex 的值会在每次调用后增加

  • 不设置全局标志,在同一字符串中多次调用 exec() 方法将始终返回第一个匹配项的信息

4.2 test()

接受一个字符串参数,在模式与该参数匹配的情况下返回 true,否则返回 false。

在只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的情况下,使用这个方法比较方便。

4.3 toLocaleString()、 toString() 和 valueOf()

toLocaleString()toString()会返回正则表达式的字面量,与创建正则表达式的方式无关。

valueOf() 方法会返回正则表达式本身

5. RegExp 构造函数属性

这些属性适用于作用域中的所有正则表达式,并且受执行的最近一次正则表达式操作而变化。因为其是全局的,会不断覆盖,所以一般不要使用。

可以通过两种方式访问它们,分别有长属性和一个短属性

长属性名 短属性名 说明
input $_ 最近一次要匹配的字符串
lastMatch $& 最近一次的匹配项
lastParen $+ 最近一次匹配的捕获组
leftContext $` input 字符串中 lastMatch 之前的文本
multiline $* 布尔值,表示是否所有表达式都使用多行模式
rightContext $’ Input 字符串中 lastMatch 之后的文本

使用给这些属性可以从 exec()test() 执行的操作中提取出更具体的信息。

var text = "this has been a short summer";
var pattern = /(.)hort/g;

if (pattern.test(text)) {
  console.log(RegExp.input); //this has been a short summer
  console.log(RegExp.leftContext); // this has been a
  console.log(RegExp.rightContext); // summer
  console.log(RegExp.lastMatch); // short
  console.log(RegExp.lastParen); // s
  console.log(RegExp.multiline); //false
}

使用短属性时,要注意,它们大多数不是有效的,因此必须通过方括号语法来访问

if (pattern.test(text)) {
  console.log(RegExp.$_);
  console.log(RegExp["$`"]);
  console.log(RegExp["$''"]);
  console.log(RegExp["$&"]);
  console.log(RegExp["$+"]);
  console.log(RegExp["$*"]);
}

除了上面的属性,还有多达 9 个用于存储捕获组的构造函数属性:RegExp.$1 RegExp.$2RegExp.$9。在调用 exec()test() 方法时,这些属性会被自动填充

var text = "this has been a short summer";
var pattern = /(..)or(.)/g;

if (pattern.test(text)) {
  console.log(RegExp.$1); // sh
  console.log(RegExp.$2); // t
}